2009-08-08 73 views
10

代碼1:這兩個代碼示例有什麼區別?

var Something = { 
name: "Name", 
    sayHi: function(){ 
    alert(Something.name); 
    } 
} 

代碼2:

function Something(){ 
    this.name = "Name"; 
} 

Something.prototype.sayHi = function(){ 
    alert(Something.name); 
} 

編輯: 所以,小夥子們,你的意思是第二個是更好?或更「正式」?

+0

這對我來說也是一個很好的問題,感謝張貼。 – 2009-08-08 07:02:37

+0

關於編輯中的問題,取決於你想要做什麼。如果您只有對象的一個​​副本,請使用第一種語法。如果想要創建多個副本(比如'Something'是其他語言的'Class'),可以使用第二種語法(或者實際上是一個編輯過的版本,在其中使用'this.sayHi =函數(){...}',這是常態)。 – 2009-08-08 07:07:49

回答

8

基本上在第一個例子中,你聲明瞭一個object literal,它實際上已經是一個對象實例。

在第二個示例中,您可以定義一個構造函數,該函數可以與new運算符一起使用來創建對象實例。

對象文字也可以用來創建對象的新實例並做原型繼承,道格拉斯克羅克福德也提倡這種技術。

基本上你可以有一個object操作:

function object(o) { 
    function F() {} 
    F.prototype = o; 
    return new F(); 
} 

這個輔助功能可以在一個非常直觀和方便的方式使用。

它主要接收對象作爲參數,將創建一個新的對象實例功能裏面,舊的對象是新對象的原型,它的返回。

它可以像這樣使用:

var oldObject = { 
    firstMethod: function() { alert('first'); }, 
    secondMethod: function() { alert('second'); }, 
}; 

var newObject = object(oldObject); 
newObject.thirdMethod = function() { alert('third'); }; 

var otherObject = object(newObject); 
otherObject.firstMethod(); 

你可以走得更遠,只要你想,從之前定義的對象作出新的實例。

推薦:

+0

使用'Object(Something)'與使用'new'關鍵字不一樣。特別是,如果您在第一種情況下更改任何財產,它將在全球範圍內更改。例如'Object(Something).name =「new name」'將其改變爲Something本身,而'(new Something())。name =「new name」'只會改變該特定的_instance_。 – 2009-08-08 07:03:50

+0

是的,對不起,我在想這篇文章中描述的'object'操作符... http://javascript.crockford.com/prototypal.html – CMS 2009-08-08 07:28:02

+0

@Sinan,大量編輯...... 24小時沒有睡覺: - )... – CMS 2009-08-08 07:49:31

7

第一個代碼片段Something是一個簡單的對象,而不是一個構造函數。特別是,你不能打電話:

var o = new Something(); 

這種形式的創建對象是完美的單身;你只需要一個實例的對象。

第二片斷,Something是一個構造函數,您可以使用關鍵字new它。

編輯:

而且,在你的第二個片段,因爲你正在使用Something.name而不是this.name,它總是會提醒構造本身,這是「東西」的名字,除非你用類似於Something.name = "Cool";的東西覆蓋該屬性。

你可能希望該行說:

alert(this.name); 
1

在第一個例子中,你可以做

Something.sayHi(); 

,而在第二個你必須這樣做

new Something().sayHi();