[英]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.