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

Why we use "prototype" property to add methods to constructor instances?

本文关键字:属性 构造函数 实例 方法 添加 我们 原型 为什么      更新时间:2023-09-26

我正在创建一个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使其成为继承属性。

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

通过在构造函数中直接将函数附加到this,这意味着 Student的每个实例都有自己的printName副本。这不是很有效。通过将其附加到Studentprototype链上,printName函数只有一个副本,Student的任何实例在其原型链中都有它。

虽然这两种方法在将函数附加到对象上还有其他不同之处,但这是最简单且最容易记住的。

如果你想知道这两者不同的完整原因,请参考对一个极其相似的问题的回答。