为什么我们使用 "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
副本。那不是很有效。通过将它附加到 Student
的 prototype
链,printName
函数只有一个副本,Student
的任何实例都在其原型链中包含它。
虽然这两种将函数附加到对象的方法还有其他差异,但这是最简单、最容易记住的方法。
如果您想了解两者不同原因的完整字典,请参阅 this answer 一个极其相似的问题。
我正在创建一个 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
的任何实例都在其原型链中包含它。
虽然这两种将函数附加到对象的方法还有其他差异,但这是最简单、最容易记住的方法。
如果您想了解两者不同原因的完整字典,请参阅 this answer 一个极其相似的问题。