【发布时间】:2015-02-18 12:23:48
【问题描述】:
我希望这会导致控制台:“2”和“11”。但相反,它给了我“2”和“2”。为什么publicFunc2 没有被覆盖? http://jsfiddle.net/17b5ytmq/1/。我想我不了解 Javascript 中的子类化。
function MyClass() {
var self = this;
this._protectedArr = [1];
this.publicFunc = function() {
this._protectedArr.forEach(function(element, index, array) {
console.log(element + self.publicFunc2());
});
}
this.publicFunc2 = function () {
return 1;
}
}
function MyClassChild() {
this.publicFunc2 = function () {
return 10;
}
}
var myClass = new MyClass();
myClass.publicFunc();
MyClassChild.prototype = myClass;
var myClassChild = new MyClassChild()
myClassChild.publicFunc();
【问题讨论】:
-
因为您使用缓存的
self引用原始对象而不是this,后者将是调用者定义的对象。 -
@squint 但我不能在回调中使用
this。如何处理? -
.forEach()接受第二个参数来定义回调的this值,因此在回调之后传递this。 ...像这样:jsfiddle.net/17b5ytmq/2 -
@user1561346:不确定你的意思。接受第二个参数的是
.forEach()。查看演示。this._protectedArr.forEach(function(element, index, array) { console.log(element + this.publicFunc2()); }, this); // <--- -
如果您的意思是在另一种情况下您不能以这种方式设置回调的
this值,那么您可以使用.bind()或只创建您的self变量内部this.publicFunc()像这样:this.publicFunc() { var self = this; this._protectedArr.forEach(func...
标签: javascript oop prototype subclass