2010-01-04 73 views
4

创建对象有两种创建在JavaScript对象的方法有两种:新主场迎战{}在JavaScript

  1. 一个“构造函数”
  2. 回报的字典{使用新的},并设置适当的键/值对

首先是,例如

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

foo = new FooType(); 
foo.hello(); 

第二是

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

foo = fooFactory(); 
foo.hello(); 

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

除了有这个绑定到全局对象的错误的风险,这两个方法是完全等价的吗(也考虑原型继承等)?

+0

见http://stackoverflow.com/questions/444170/object-oriented-questions-in-javascript – 2010-01-04 13:49:44

回答

6

他们是不等价的,特别是考虑到原型继承时。

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

var foo = new FooType(); 

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

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

你能做到这一点的fooFactory方式的唯一方法是将其添加到object原型这是一个非常糟糕的主意。

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

考虑使用这个代替:

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

在示例1中,foo继承自FooType的原型(它没有任何更改)。 foo instanceof FooType在这个例子中是正确的。在例子二中,没有继承。如果你将要重用的方法,例如使用一个,但是可以定义共享方法上FooType.prototype,而不是在函数体:

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