如何使用Javascript中的经典原型方法

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功能,所以_valAnswer会为设置FirmAnswer而不是为Answer(请纠正我,如果我错了).

因此,如果上述分析是正确的,那么它会导致我的混淆,为什么返回的get属性而不仅仅是因为已经设置为调用时?FirmAnswer.prototypeAnswer.prototype.get.call(this)Answer.prototype.get()thisFirmAnswernew FirmAsnwer(7)

请给我一些启示,因为我现在很困惑.我很确定我很了解原型方法,但经典方法让我很困惑.

先感谢您!

lon*_*day 1

自编辑问题以来不相关

这是一段奇怪的代码,包含一个错误和其他一些无法解释的内容。

错误是这一行:

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)