JavaScript 'new'奇怪的用法



如果构造函数只是一个带有'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();

我有两个答案:

  1. o2的'prototype'是Object,因此,o2 instanceof Two返回false
  2. 函数getMessage分别为Two的每个实例定义,但是One只在One的原型中定义。

还有其他"为什么是错的"的答案吗?

Option1将方法与类型关联起来,这样您就不必每次需要One类型时都重新定义函数。这将导致更好的性能和更少的内存使用。

在选项2中,每次实例化一个动态对象时都要重新定义该对象。

我所知道的是,当你添加属性到原型,你要确保这个属性是所有实例之间共享,因此,它是内存优化,如果你将有一个对象实例化一百次。

如果你是典型的OOP(如c#)背景,那么在原型中添加属性在某种程度上类似于定义静态字段

Public static string msg = " hello";

执行100x new Two(message),您将创建100x getMessage function。如果get消息变得非常复杂,这对内存的影响很大。如果你把它写进原型中,不管你创建了多少次新的实例,你都只能得到一个函数。访问原型比直接访问要慢一点。如果它是单例的,你不需要prototype。如果是工厂,请带样品去。

供参考:我使用es6,所以原型无处不在:)

最新更新