Javascript 为什么我们使用;原型;属性将方法添加到构造函数实例?
我正在创建一个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
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”中,您将创建多个函数,所有函数都执行完全相同的操作。