diff --git a/doc/zhtw/object/general.md b/doc/zhtw/object/general.md index aee1885c..3bed5cd4 100644 --- a/doc/zhtw/object/general.md +++ b/doc/zhtw/object/general.md @@ -1,19 +1,19 @@ ## 物件的使用和屬性 -在 Javascript 中全部都是物件,除了 [`null`](#core.undefined) 和 [`undefined`](#core.undefined)。 +在 Javascript 中,除了 [`null`](#core.undefined) 和 [`undefined`](#core.undefined)之外,任何的東西皆是物件。 false.toString(); // 'false' [1, 2, 3].toString(); // '1,2,3' - + function Foo(){} Foo.bar = 1; Foo.bar; // 1 -一個常見的誤解就是字面值(literal)不是物件。這是因為 JavaScript 編譯器的一個錯誤,它試圖把 *點操作符* 解析為浮點數的字面值的一部分。 +一個常見的誤解就是數字字面常數(number literal)不是物件。這是因為 JavaScript 編譯器的一個錯誤,它試圖把 *點操作符* 解析為浮點數字面常數的一部分。 2.toString(); // 出錯: SyntaxError -有很多變通方法可以讓數字的字面值看起來像物件。 +有很多的方法可以讓數字字面常數作用的像個物件。 2..toString(); // 第二個點號可以正常解析 2 .toString(); // 注意點號前面的空格 @@ -27,28 +27,28 @@ JavaScript 的物件可以作為 [*Hashmaps*][1]使用,主要用來保存命 var foo = {}; // 一個空的物件 - // 一個新的物件,有值為 12 的自定義屬性 'test' - var bar = {test: 12}; + // 一個新的物件,有一個值為 12 的自定義屬性 'test' + var bar = {test: 12}; ### 訪問屬性 -有兩種方式來訪問物件的屬性,點操作或是中括號操作。 - +有兩種訪問物件屬性的方法,點操作或是中括號操作。 + var foo = {name: 'kitten'} foo.name; // kitten foo['name']; // kitten - + var get = 'name'; foo[get]; // kitten - + foo.1234; // SyntaxError foo['1234']; // works -兩種語法是相等的,唯一的差別是,使用中括號允許你動態的設定屬性,使用點操作不允許屬性為變數,否則會造成語法錯誤 +兩種語法幾乎是相等的,唯一的差別是,使用中括號允許你動態的設定屬性,使用點操作不允許屬性為變數,否則會造成語法錯誤 ### 刪除屬性 -唯一刪除屬性的方式就是用 `delete` 操作符。設置屬性為 `undefined` 或是 `null` 只有刪除的屬性和值的關聯,沒有真的刪掉屬性 +唯一刪除屬性的方式就是用 `delete` 操作符。將屬性設置為 `undefined` 或是 `null` 只會移除屬性和值之間關聯,沒有真的刪掉掉該屬性的鍵(key) var obj = { bar: 1, @@ -79,7 +79,6 @@ JavaScript 的物件可以作為 [*Hashmaps*][1]使用,主要用來保存命 物件的屬性名可以使用字符串或是普通的宣告。但是由於 JavaScript 編譯器存在一個錯誤設計。 上面的兩種方式在 ECMAScript 5之前都會拋出 `SyntaxError` 的錯誤。 -這個錯誤的原因是 `delete` 是 JavaScript 語言的一個 *關鍵字* 因此為了在更低的版本能執行最好用 *string literal* +這個錯誤的原因是 `delete` 是 JavaScript 語言的一個 *關鍵字* 因此為了在更低的版本能執行最好使用用 *string literal* [1]: http://en.wikipedia.org/wiki/Hashmap - diff --git a/doc/zhtw/object/prototype.md b/doc/zhtw/object/prototype.md index 83ad784a..c3e63dc5 100644 --- a/doc/zhtw/object/prototype.md +++ b/doc/zhtw/object/prototype.md @@ -1,16 +1,16 @@ ## Prototype -JavaScript 不包含傳統繼承的模型,它使用的是*原型*模型。 +JavaScript 並不包含傳統的繼承模型,它使用的是*原型*繼承模型。 -儘管常常有人提及 JavaScript 的缺點,但基於原型的繼承模型比傳統繼承更強大。 -實現傳統的類繼承模型是很簡單。但是在 JavaScript 中實現原型的繼承模型則要困難很多。 +儘管常常有人提及這是 JavaScript 的一個缺點,但事實上*原型*繼承模型比傳統繼承模型更加的強大。 +真的就是如此!舉例來說,基於原型繼承模型來實現傳統的繼承模型是非常輕而易舉的一件事。但要是反過來,則會困難許多。 -由於 JavaScript 是唯一一個被廣泛使用的基於原型繼承的語言,所以我們必須要花時間來理解這兩者的不同。 +由於 JavaScript 是唯一一個被廣泛使用的基於原型繼承的語言,所以我們必須要花時間來理解這兩種繼承模型的不同。 -第一個不同之處在於 JavaScript 使用 *原型鏈* 的繼承方式。 +第一個主要不同之處在於 JavaScript 使用 *原型鏈* 的繼承方式。 -> **注意: ** 簡單的使用 `Bar.prototype = Foo.prototype` 將會導致兩個對象共享 **相同** 的原型。 ->因此,改變任一個原型都會去影響到另外一個,這在大部分的時候不是想得到的結果。 +> **注意: ** 輕易的使用 `Bar.prototype = Foo.prototype` 將會導致兩個對象共享 **相同** 的原型。 +>因此,改變任一個原型都會去影響到另外一個,這在大部分的時候不會是你想得到的結果。 function Foo() { this.value = 42; @@ -39,7 +39,7 @@ JavaScript 不包含傳統繼承的模型,它使用的是*原型*模型。 Object.prototype { toString: ... /* etc. */ } -上面的例子中,物件 `test` 會繼承來自 `Bar.prototype` 和 `Foo.prototype`。因此它可以進入來自 `Foo` 原型的方法 `method`。 +上面的例子中,物件 `test` 會繼承來自 `Bar.prototype` 和 `Foo.prototype`。因此它可以訪問來自 `Foo` 原型的方法 `method`。 同時它也可以訪問 **那個** 定義在原型上的 `Foo` 實例屬性 `value`。 要注意的是 `new Bar()` **沒有** 創立一個新的 `Foo` 實例,它重複利用的原本的 prototype。因此, `Bar` 的實例會分享到 **相同** 的 `value` 屬性。 @@ -64,13 +64,13 @@ JavaScript 不包含傳統繼承的模型,它使用的是*原型*模型。 ### 效能 -如果看在屬性在原型鏈的上端,對於查詢都會有不利的影響。特別的,試圖獲取一個不存在的屬性將會找遍所有原型鏈。 +如果查詢的屬性在原型鏈的上端,對於查詢都會有不利的影響。更進一步來說,試圖訪問一個不存在的屬性將會找遍所有原型鏈。 並且,當使用 [迴圈](#object.forinloop)找尋所有物件的屬性時,原型鏈上的 **所有** 屬性都會被訪問。 ### 擴展 Native Prototype -一個經常發生的錯誤,那就是擴展 `Object.prototype` 或者是其他內建類型的原型物件。 +一個經常發生的錯誤,那就是擴展 `Object.prototype` 或者是其他內建的原型物件。 這種技術叫做 [monkey patching][1] 並且會破壞 *封裝*。雖然被廣泛的應用到一些 Javascript 的架構,像是 [Prototype](http://prototypejs.org) , 但仍然沒有好的理由新增一個 *非標準* 的功能去搞亂內建型別。 @@ -80,7 +80,7 @@ JavaScript 不包含傳統繼承的模型,它使用的是*原型*模型。 在寫複雜的程式碼的時候,要 **充分理解** 所有程式繼承的屬性還有原型鏈。 還要提防原型鏈過長帶來的性能問題,並知道如何通過縮短原型鏈來提高性能。 -絕對 **不要使用** `native prototype` 除非是為了和新的 JavaScript 引擎作兼容。 +除非是為了和新的 JavaScript 引擎作兼容,否則 **絕對不要** 拓展`native prototype`。 [1]: http://en.wikipedia.org/wiki/Monkey_patch [2]: http://prototypejs.org/