JavaScript原型继承

3
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中的继承,但是对于上述两种方法,结果都是相同的。所以我很困惑应该选择哪种方法以及为什么。


简短回答,最后一个更好。 - Endless
1个回答

3
前者的原型为空,只包含构造函数。而后者则有一个拥有行为(比如 sayName)的原型。
由于前者没有原型,所以无法从中继承行为。而在后者中,原型可以被传递和继承。
此外,从内存管理和代码执行的角度来看,原型更加高效。V8(谷歌的JavaScript解释器)以及大多数其他JS解释器,在解释原型时会构建可重用的代码。这既节省了空间,也提高了速度,因为不需要多个不同的函数,也不需要每次需要时构建它们。

通过在子类构造函数中调用构造函数,似乎可以轻松地从第一个类继承行为:function subClass(name){ Person.call(this, name) } - Mark
@MarkMeyer - 有其他方法可以通过保留执行上下文来访问行为。但是,如果要在继承的意义上实际使用它,这就变得更加棘手了。 - Travis J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接