2011-03-28 117 views
2

我之前看到這個代碼,但我不知道是什麼意思:我可以在對象中創建一個方法嗎?

var person1 = { 
    toLocaleString : function(){ 
     return "Nikolaos"; 
    }, 
    toString : function(){ 
     return "Nicholas"; 
    } 
} 

var person2 = { 
    toLocaleString : function(){ 
     return "bum"; 
    }, 
    toString : function(){ 
     return "Greg"; 
    } 

} 

var people = [person1, person2]; 
alert(people.toString()); 
alert(people.toLocaleString()); 

沒有的功能創建的toLocaleString方法和toString?或者......一個對象?

+0

不能測試這個,所以我不完全確定,但我不調試這應該工作,應該是人[0] .toString()或人[1] .toString() – 2011-03-28 08:13:24

+0

您的問題是有點不清楚給我。你想知道什麼?也許你應該看看'toString'文檔:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/toString – 2011-03-28 08:19:15

+0

@Han在這裏你去:http://jsfiddle.net/yahavbr/MgMaP/ – 2011-03-28 08:32:40

回答

4

該代碼是做三件事情:

  1. 使用對象文字語法創建對象實例
  2. 使用匿名函數表達式來創建函數和將它們綁定到對象上的屬性。 (函數是JavaScript中的第一類對象,因此您可以保留對它們的引用,傳遞引用等)
  3. 特別是,它覆蓋了兩個標準函數,即所有JavaScript對象都從Object原型繼承而來。

讓我們分析一下。

1)對象的文字符號:

var obj = {propName: propValue}; 

{在這種情況下}表示一個對象常量。在對象文字中,您可以編寫propName: propValue以將propValue分配給對象上名稱爲propName的屬性。這與以下內容相同:

var obj = {};    // Get an empty object 
obj.propName = propValue; // Add a property to it 

您可以使用逗號分隔多個屬性。例如:

var obj = { 
    author: "Douglas Adams", 
    title: "The Hitchhiker's Guide to the Galaxy", 
    answer: 42 
}; 

這將創建一個具有三個屬性的對象,其中兩個具有字符串值,另一個具有數字值。

注意,右側被處理就像一個任務,所以可以是任何東西,可以在賦值語句的右邊出現:

var x = "bar"; 
var obj = { 
    three: 1 + 2, 
    fubar: "foo " + x 
}; 

屬性名稱可放在報價,如果你喜歡:

var x = "bar"; 
var obj = { 
    "three": 1 + 2, 
    "fubar": "foo " + x 
}; 

...這是非常方便的指定具有保留標記的名稱(如「如果」,或「返回」)屬性或以前,保留標記(如「階級」 )如果它們不在引號內,將會出現語法錯誤。

2)現在讓我們看一下函數表達式:

var f = function() { /* your code here */ }; 

這是一個函數表達式。它創建一個新函數並將其引用給變量f。您可以致電f()致電。

var f = function(name) { 
    alert("Hi " + name); 
}; 
f("Fred"); // alerts "Hi Fred" 

1 + 2),因此,與對象的文字符號將其組合在一起:

var obj = { 
    foo: function(name) { 
     alert("Hi " + name); 
    } 
}; 
obj.foo("Fred"); // alerts "Hi Fred" 

(我不喜歡匿名函數,I prefer my functions to have names,但那是另一個話題)

3)。最後:正如maerics指出的那樣,該代碼中使用的特定功能是toStringtoLocaleString,這兩者都是JavaScript對象的標準功能。這意味着那些將覆蓋的標準版本,因此只要標準函數被調用就返回給定的值。

+2

當你需要一個時,永遠不會有+2按鈕; ;-) – 2011-03-28 09:14:20

1

toLocaleString()方法是由specification of the language爲所有JavaScript對象實現的。因此,數組(例如存儲在「people」變量中的數組)似乎通過分別返回每個元素的字符串或「locale string」值(至少在我們正在測試的Web瀏覽器中)來實現這些方法。

也就是說,Array類toStringtoLocaleString方法必須的東西等等來實現:

Array.prototype.toString = function() { 
    var a = []; 
    for (var i=0; i<this.length; i++) { 
    a[i] = this[i].toString(); // Note "toString". 
    } 
    return a.join(","); 
} 

Array.prototype.toLocaleString = function() { 
    var a = []; 
    for (var i=0; i<this.length; i++) { 
    a[i] = this[i].toLocaleString(); // Note "toLocaleString". 
    } 
    return a.join(","); 
} 
+0

那裏的原型方法是什麼?我從來沒有明白這一點。 – 2011-03-28 08:35:34

+0

那麼,函數中定義的toLocaleString和toString屬性是什麼,那是什麼? – dramasea 2011-03-28 08:38:47

+2

@Michael:'prototype'是JavaScript中繼承的基礎。它是所有函數的一個屬性,如果通過'new'關鍵字將函數用作*構造函數*,則會使用它。該函數的'prototype'屬性引用的對象被指定爲該函數創建的對象的* prototype *,這意味着該對象本質上可以訪問該對象上的所有屬性(包括 - 顯着 - 屬性指的是功能)。 – 2011-03-28 08:41:19

相關問題