簡體   English   中英

不懂JavaScript原型

[英]Don't understand JavaScript prototype

我正在閱讀JavaScript Good Parts。 有一個例子:

if (typeof Object.create !== 'function') {
    Object.create = function(o) {
        var F = function(){};
        F.prototype = o;
        return new F();
    }
}

有人可以向我解釋這意味着什么嗎? 首先,Object已經有一個具有此名稱的方法,因為當我運行它時:

console.log(typeof Object.create);

輸出是'功能'?

要回答你的“開頭......”,你可能還會遇到Javascript環境

console.log(typeof Object.create);

將報告

undefined

或者某些這樣的(假設你甚至有一個帶有日志功能的控制台對象。)外部if (typeof Object.create !== 'function')包裝器的原因是只在你的JS環境沒有的情況下定義它我們已經這樣做了。 有許多舊的瀏覽器和其他環境,您的代碼可能有一天會運行,可能無法定義Object.create

現在關於這個實際函數是如何工作的,它基於JS處理對象的方式。 對象只是命名屬性的集合,或者是String名稱和屬性值之間更恰當的關聯。 但是許多人也有一個特殊的屬性,這是他們的prototype 這只是指向另一個對象的指針。 該對象也可以擁有自己的prototype對象,依此類推。 但最終,當其中一個對象的prototype為null時,原型鏈就會消失。 這些原型對象也是命名屬性的集合,當Javascript引擎在您的對象中搜索命名屬性時,如果它沒有直接在您的對象上找到它,它會檢查您的對象的原型是否可能包含它,如果不,如果該對象的原型可能包含它,依此類推,直到鏈條消失。

這些原型對象的重點是它們可以共享。 幾個對象,甚至幾百萬個對象,可以共享一個原型。 這與基於類的繼承方案的工作方式大不相同,但通常可以用於類似的目的。 您可以定義函數的單個副本,並且從公共構造函數創建的所有對象都將使用該副本。 在創建Object.create等技術之前,這是在Javascript中進行面向對象編程的唯一真正方法。

Crockford的代碼使用舊技術來模擬新技術應該做的部分內容。 Object.create定義了一些通過舊機制無法實現的行為,但最基本的行為只是創建一個原型是指定對象的新對象。 這正是舊技術,使用F.prototype = o; return new F(); F.prototype = o; return new F(); 實現。 因此,此代碼幾乎是將新行為填充到舊環境中的標准方法。 有關此示例,請參閱MDN創建頁面

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM