Rol*_*hon 8 javascript prototype-programming prototype-chain prototype-pattern
我正在学习Javascript中面向对象编程的旅程.我从这里获得了这个视频版本http://www.objectplayground.com/我理解了相当多的原型方法而不是经典方法.
在观察内容时,我暂停了显示的经典方法与子类一起使用的示例,如下所示:
//superclass
function Answer(value){
this._val = value;
}
//define prototype property 'get' for the superclass
Answer.prototype.get = function fn1(){
return this._val;
}
//subclass
function FirmAnswer(value){
Answer.call(this,value);
}
FirmAnswer.prototype = Object.create(Answer.prototype);
FirmAnswer.prototype.constructor = FirmAnswer;
//define prototype property 'get' for subclass
FirmAnswer.prototype.get = function fn2(){
return Answer.prototype.get.call(this);
}
var luckAnswer = new FirmAnswer(7);
luckAnswer.get(); //7
Run Code Online (Sandbox Code Playgroud)
题:
从我的理解call函数,它将设置this当前上下文是例如从该行Answer.call(this,value)从FirmAnswer功能,所以_val从Answer会为设置FirmAnswer而不是为Answer(请纠正我,如果我错了).
因此,如果上述分析是正确的,那么它会导致我的混淆,为什么返回的get属性而不仅仅是因为已经设置为调用时?FirmAnswer.prototypeAnswer.prototype.get.call(this)Answer.prototype.get()thisFirmAnswernew FirmAsnwer(7)
请给我一些启示,因为我现在很困惑.我很确定我很了解原型方法,但经典方法让我很困惑.
先感谢您!
自编辑问题以来不相关
这是一段奇怪的代码,包含一个错误和其他一些无法解释的内容。
错误是这一行:
FirmAnswer.prototype.get = Object.create(Answer.prototype);
Run Code Online (Sandbox Code Playgroud)
这显然是无意义的代码,特别是FirmAnswer.prototype.get在两行之后设置为更明智的代码。我相当确定它的意思是:
FirmAnswer.prototype = Object.create(Answer.prototype);
Run Code Online (Sandbox Code Playgroud)
这是 ES6 之前的 Javascript 中进行原型继承的正常方法。
结束无关紧要的事情
我不明白为什么要设置为另一个方法,一旦修复上述错误,在任何情况下FirmAnswer.prototype.get都会将调用委托给该方法。Answer.prototype.get
但是,您问了一个具体问题:为什么需要这一行:
return Answer.prototype.get.call(this);
Run Code Online (Sandbox Code Playgroud)
为什么我们不能这样做Answer.prototype.get()?当我们这样做时,它仅为该调用Answer.call(this,value);设置上下文(值)。this它只影响构造函数。如果这样做Answer.prototype.get(),函数调用的上下文实际上是Answer.prototype,它没有属性_val。
然而,这一切都无关紧要,因为实际上并不需要该方法。这是更合理形式的代码:
FirmAnswer.prototype.get = Object.create(Answer.prototype);
Run Code Online (Sandbox Code Playgroud)