为什么我们使用"原型"用于向构造函数实例添加方法的属性?

时间:2015-07-07 15:37:24

标签: javascript oop prototypal-inheritance

我正在创建一个JavaScript构造函数。考虑这个例子:

function Student(name)
{
    this.name = name;
}

Student.prototype.printName = function(){
    console.log(this.name);
}

var s = new Student("Eden");
s.printName();

上面的代码很有效。但我也可以这样写:

function Student(name)
{
    this.name = name;

    this.printName = function(){
        console.log(this.name);
    }
}

var s = new Student("Eden");
s.printName();

我觉得第二种方法是正确的,因为printName应该是新对象的属性而不是继承属性。添加到prototype会使其成为继承属性。

为什么开发人员更喜欢第一种方法?

1 个答案:

答案 0 :(得分:2)

通过在构造函数中将函数直接附加到this,这意味着 Student的每个实例都拥有它自己的printName副本。这不是非常有效。通过将其附加到prototype的{​​{1}}链,只有Student函数的一个副本,而printName的任何实例都包含在其中的{/ 1}}原型链中

虽然这两种方法在将对象附加到对象方面存在其他差异,但这是最简单和最容易记住的。

如果您想要完整的原因字典,请参阅this answer一个非常相似的问题。