【问题标题】:Javascript prototypal Inheritence [duplicate]Javascript原型继承[重复]
【发布时间】:2019-01-24 05:22:05
【问题描述】:
var Person = function(name){
    this.name = name;

    this.sayName = function () {
        console.log("My Name is "+ this.name);
    }
}

var nitin = new Person("Nitin");

nitin.sayName(); // My Name is Nitin


// Codebreak

var Person = function(name){
    this.name = name;
}

Person.prototype.sayName = function (){
  console.log("My Name is "+ this.name);
}

var nitin = new Person("Nitin");

nitin.sayName(); // My Name is Nitin

我在 JS 中进行继承,但对于上述两种方法,结果是相同的。所以我在这里很困惑要遵循哪种方法以及为什么?

【问题讨论】:

  • 简答,最后一个更好

标签: javascript inheritance prototypal-inheritance


【解决方案1】:

前者有一个空原型,仅由构造函数组成。后者有一个带有行为(sayName)的原型。

不可能从第一个例子继承行为,因为它没有原型,而在第二个例子中,原型可以被传递并继承自。

此外,从内存管理/代码执行的角度来看,原型更高效。 V8(Google 的 JavaScript 解释器)和大多数其他 JS 解释器在解释原型时会从原型构造可重用代码。这既节省了不需要多个不同功能的空间,也节省了每次需要时都不需要构建它们的速度。

【讨论】:

  • 您似乎可以通过调用子类构造函数中的构造函数轻松地从第一个继承行为:function subClass(name){ Person.call(this, name) }
  • @MarkMeyer - 有一些方法可以通过其他方式访问行为,特别是如果您保留执行上下文。在继承的意义上实际使用它会变得更加棘手。
猜你喜欢
  • 2016-07-04
  • 2020-12-28
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 2010-09-28
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多