2009-09-14 37 views
11

任何人都可以請告訴我,這裏的Javascript差=對象

MyClass.prototype = new Object(); //or ... = {} 

MyClass.prototype = Object; 

之間的區別是什麼?如果結果沒有區別,哪一個是最佳實踐方式?

+0

可能重複(HTTP:/ /stackoverflow.com/questions/12592913/what-is-the-reason-to-use-the-new-keyword-here) – Bergi 2014-02-18 21:09:23

+1

@Bergi這個問題已經超過4年了。你鏈接到的那個是2歲... – moxn 2014-02-19 22:10:41

+0

這個1.5歲的答案仍然有效,這個問題仍然可以通過搜索和鏈接找到。它應該指向其他有用的答案... – Bergi 2014-02-20 10:36:52

回答

11

你的前兩個例子是完全等價的:

MyClass.prototype = new Object(); // empty object 
MyClass.prototype = {}; // empty object 

你的第三個例子是無效的,因爲你是分配給MyClass.prototype到參考構造函數是Object,它是一個函數,而不是一個新對象。

我個人比較傾向於第二種,對象literalinitialiser語法:

MyClass.prototype = {prop1: 'value', prop2: 'value2'}; 
//... 
MyClass.prototype.foo = 'bar'; 
MyClass.prototype.method1: function() {/**/}; 

編輯:在回答您的意見,一個空的對象文本{ }實質上等同於new Object()因爲這樣:

生產ObjectLiteral:{}是 評估如下:

  1. 通過表達式new Object()創建一個新對象。
  2. 返回結果(1)。

詳情檢查ECMAScript Language Spec(PDF)的11.1.5節(對象初始化劑)。

編輯:第三個例子不會產生任何錯誤,但也不好,例如,如果你擴展後的MyClass.prototype您可以輕鬆地揍了對象的構造函數:

MyClass.prototype = Object; 
MyClass.prototype.foo = 'bar'; 

Object.foo === MyClass.prototype.foo; // true 
+0

嗯,所以如果這兩個例子不會產生任何類型的錯誤,本質上做同樣的事情(實際上是這樣),它只是瀏覽器的JavaScript引擎的鬆弛,允許第二個示例工作? – moxn 2009-09-14 06:45:36

+0

不,我知道{} == new Object()。 「第二個例子」的意思是... prototype = Object; – moxn 2009-09-14 06:59:59

+0

好的,我明白了。謝謝你的解釋。 – moxn 2009-09-14 07:14:31

2

這取決於Object。如果它是您想要使用new Object()方法的功能。如果它是「虛擬班級」(使用Object = {someProperty: someValue}定義),則使用第二種方法。

this page原型繼承一​​些更多的指針在JavaScript

+1

偉大的鏈接,謝謝 – moxn 2009-09-14 06:47:37

0

MyClass.prototype.method1:function() {/ ** /};

校正上述:它應該是

MyClass.prototype.method1 = function() {/**/}; 

(注意等於 '方法1' 後符號)。

當該方法定義本身是一個對象的定義內,像冒號僅用於:什麼是在這裏使用的「新」的關鍵字的原因]的

var myObject = {myVar1: 10, myMethod1: function() { /* */};