为什么我们使用“原型”?属性向构造函数实例添加方法
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
的任何实例在其原型链中都有它。
虽然这两种方法在将函数附加到对象上还有其他不同之处,但这是最简单且最容易记住的。
如果你想知道这两者不同的完整原因,请参考对一个极其相似的问题的回答。
相关文章:
- javascript中对象构造函数中的var属性与this.properties
- Javascript:为什么是构造函数's __proto__属性Empty(){}
- Javascript - 如何向对象构造函数添加属性
- JS构造函数的原型属性与其原型之间的区别
- 属性在我的自定义构造函数中无法正常运行 - Javascript
- 正在重置原型对象的构造函数属性
- 数.[属性] 是对象或构造函数的属性
- 在Javascript构造函数中定义属性的正确方式
- 如何在运行时访问typescript类公共属性(调试)?只有构造函数和函数是可访问的
- 通过程序从构造函数中检索属性名称
- 向构造函数或原型添加属性之间的区别
- Angular 2 Component自定义属性在构造函数中为null
- 使用构造函数创建的数字没有其值作为属性,请取消String与构造函数的链接
- 在定义了构造函数之后,是否可以将实例属性添加到JavaScript原型中
- 在挖空中引用对象构造函数外部视图模型的属性
- Javascript:类构造函数基础 - 在单独的方法中定义属性
- 如何在 JavaScript 中冻结构造函数中的属性
- 在使用函数作为构造函数时,我在初始化属性时卡住了这个运算符.我的代码如下
- 未捕获的类型错误: 无法读取未定义的属性“构造函数”
- Javascript -为什么要循环?(原型属性->构造函数属性->函数对象->构造函数属性)