JavaScript'新'奇怪的用法

时间:2014-05-13 20:04:47

标签: javascript

如果构造函数只是一个函数,'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是Object,因此o2 instanceof Two返回false
  2. 函数getMessage是为Two的每个实例单独定义的,但One仅在One的原型中定义。
  3. 任何其他答案“为什么这是错的”?

3 个答案:

答案 0 :(得分:3)

Option1将方法与类型相关联,这样您就不必在每次需要One类型时重新定义该函数。这样可以提高性能并降低内存使用量。

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

答案 1 :(得分:0)

我所知道的是,当您向原型添加属性时,您确保在所有实例之间共享此属性,因此如果您将一个对象实例化一百次,则进行内存优化。

如果您来自像c#这样的典型OOP,那么向原型添加属性在某种程度上类似于定义静态字段

Public static string msg = " hello";

答案 2 :(得分:0)

执行100x new Two(message),您将创建100x getMessage function。如果获取消息变得非常复杂,那将对内存产生很大的影响。 如果你将它写入原型,你将只获得一个函数no metters你将创建一个新的Two实例多少次。访问原型比直接访问慢一点。 如果它的单身,你不需要原型。 如果是工厂,请使用原型。

仅供参考:我正在使用es6,所以原型到处都是:)