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

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

我正在创建一个 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 的任何实例都在其原型链中包含它。

虽然这两种将函数附加到对象的方法还有其他差异,但这是最简单、最容易记住的方法。

如果您想了解两者不同原因的完整字典,请参阅 this answer 一个极其相似的问题。