Javascript 为什么我们使用;原型;属性将方法添加到构造函数实例?

Javascript 为什么我们使用;原型;属性将方法添加到构造函数实例?,javascript,oop,prototypal-inheritance,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

我正在创建一个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
副本。这不是很有效。通过将其附加到
Student
prototype
链,只有
printName
函数的一个副本,
Student
的任何实例都在其prototype链中

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


如果你想了解这两个不同的原因,请参考一个非常相似的问题

还有,为什么您觉得
printName
应该是自己的财产呢?这是真的。尝试将添加到原型中的属性视为静态。它们对于所有实例都是相同的。如果您将它们添加到“this”中,您将创建多个函数,所有函数都执行完全相同的操作。