2010-01-04 68 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"); }; 
相關問題