在javascript中使用new与{}创建对象

时间:2010-01-04 03:52:28

标签: javascript

在javascript中有两种创建对象的方法:

  1. 在“构造函数”上使用new
  2. 返回字典{}并设置正确的键/值对
  3. 第一个是,例如

    FooType = function() {
        this.hello = function() { alert("hello"); };
    };
    
    foo = new FooType();
    foo.hello();
    

    第二个是

    fooFactory = function() {
        return { 
            hello : function() { alert("hello"); }
        };
    };
    
    foo = fooFactory();
    foo.hello();
    

    (为帖子编写的代码。不保证正确)

    除了将此绑定到全局对象的错误风险之外,这两种方法完全等效(还考虑原型继承等)吗?

2 个答案:

答案 0 :(得分:6)

它们并不等同,特别是在考虑原型继承时。

FooType = function() {
    this.hello = function() { alert("hello"); };
};

var foo = new FooType();

FooType.prototype.bye = function() { alert('bye!'); };

foo.bye(); // "bye!"

你能以fooFactory的方式实现这一目标的唯一方法是将它添加到object原型,这是一个非常糟糕的主意。

在我看来,第一种方法更有意义(因为对象具有可以检查的类型),并且如果原型正确完成,可以提供更好的性能。在第一个示例中,每次实例化一个新的FooType对象时,它都会创建一个新的“hello”函数。如果你有很多这些对象,那就浪费了大量的内存。

请考虑改用:

function FooType() { }
FooType.prototype.hello = function() {
    alert('Hello');
};

答案 1 :(得分:2)

在示例一中,foo继承自FooType的原型(未进行任何更改)。 foo instanceof FooType在示例中是正确的。在示例二中,没有继承。如果您要重用方法,请使用示例1但在FooType.prototype上定义共享方法,而不是在函数体中:

var FooType = function() {};
FooType.prototype.hello = function() { alert("hello"); };