如果构造函数只是一个带有'new'返回对象的函数,为什么不像通常那样:
function One(message){
this.message = message;
}
One.prototype.getMessage = function() {
console.log(this.message);
}
我们不做:
function Two(message){
return {
message: message,
getMessage: function() {
console.log(this.message);
}
}
}
用法相同,结果(在这个简单的例子中)相同:
var o1 = new One('One');
o1.getMessage();
var o2 = new Two('Two');
o2.getMessage();
我有两个答案:
- o2的'prototype'是Object,因此,
o2 instanceof Two
返回false - 函数getMessage分别为Two的每个实例定义,但是One只在One的原型中定义。
还有其他"为什么是错的"的答案吗?
Option1将方法与类型关联起来,这样您就不必每次需要One
类型时都重新定义函数。这将导致更好的性能和更少的内存使用。
在选项2中,每次实例化一个动态对象时都要重新定义该对象。
我所知道的是,当你添加属性到原型,你要确保这个属性是所有实例之间共享,因此,它是内存优化,如果你将有一个对象实例化一百次。
如果你是典型的OOP(如c#)背景,那么在原型中添加属性在某种程度上类似于定义静态字段
Public static string msg = " hello";
执行100x new Two(message)
,您将创建100x getMessage function
。如果get消息变得非常复杂,这对内存的影响很大。如果你把它写进原型中,不管你创建了多少次新的实例,你都只能得到一个函数。访问原型比直接访问要慢一点。如果它是单例的,你不需要prototype。如果是工厂,请带样品去。
供参考:我使用es6,所以原型无处不在:)