[英]confusion about javascript exercise
我剛剛得到了道格拉斯·克羅克福德的Javascript:The Good Parts,我很難理解他關於原型的一個例子。 書中的代碼如下:
if (typeof Object.create !== "function") {
Object.create = function(o) {
var F = function () {}
F.prototype = o;
return new F;
};
}
我假設這段代碼用於定位函數的原型。 但為什么要使用這種復雜的方法呢? 為什么不使用variable
.prototype? Crockford是Javascript領域的領先專家,所以我確信有充分的理由使用這個模型。 誰能幫助我更好地理解它? 任何幫助,將不勝感激。
在ECMAScript 3中, new
運算符是設置對象[[Prototype]]
內部屬性的唯一標准方法,在這種情況下,Crockford只是為此目的使用臨時構造函數 F
該方法的o
參數被設置為臨時構造函數的prototype
屬性,並通過調用new F();
它構建了一個繼承自F.prototype
的新空對象(有關new
工作原理的更多詳細信息,請參閱此問題 )。
例如:
var a = { a: 1 };
var b = Object.create(a); // b inherits from a
b.a; // 1
在上面的例子中,我們可以說b
的內部[[Prototype]]
屬性指向a
。
Object.getPrototypeOf(b) === a; // true
換句話說, b
繼承自a
。
使用相同的示例,我們可以使用空構造函數,例如:
function F(){}
F.prototype = a;
var b = new F(); // b again inherits from a (F.prototype)
還要記住,函數的prototype
屬性與所有對象都具有的[[Prototype]]
屬性不同,函數的prototype
屬性在使用new運算符調用時用於構建從該屬性繼承的新對象。
此外,請注意,現在,ECMAScript 5標准正在實施,而且這個墊片不符合規范100%,事實上,標准的Object.create
方法有一些功能無法在ES3上模擬 。
也可以看看:
var bar = Object.create(foo)
與
var bar = new Object()
第一個bar
以foo
為原型; 第二個是Object
作為原型。
此代碼適用於不支持Object.create
舊JavaScript實現,后者在2009年11月發布的ECMAScript 5標准中指定。
許多人說創建對象的首選方法是在創建時為其指定原型。 這可以稱為differential inheritance
或prototypal inheritance
。 實際上,這就是Object.create
作用:
var protoCircle = {x: 0, y: 0, radius: 1, color:"black"};
var myCircle = Object.create(protoCircle);
myCircle.x = 3;
myCircle.color = "green";
這使得半徑為1的綠色圓圈以(3,0)為中心。
代碼如此復雜以至於在將Object.create
添加到JavaScript之前, 設置對象原型的唯一方法是使用new
運算符創建它 。 使用new
創建的對象作為其原型獲取構造函數的prototype
屬性的值。 這絕對令人困惑,但prototype
屬性不是對象的原型。 給定一個函數對象f
, f.prototype
是將被指定為通過new f()
構造的所有對象的原型的對象。 對象的真實原型稱為[[prototype]]
或__proto__
但您無法在標准ECMAScript中訪問它們。 令人困惑,是嗎?
作為旁注。 ES5規范具有比Crockford定義的更強的Object.prototype
規范。 它需要第二個對象來配置正在定義的對象的屬性。
給定傳遞的對象作為原型,此create方法將實例化一個新對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.