簡體   English   中英

關於javascript練習的困惑

[英]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()

第一個barfoo為原型; 第二個是Object作為原型。

此代碼適用於不支持Object.create舊JavaScript實現,后者在2009年11月發布的ECMAScript 5標准中指定。

許多人說創建對象的首選方法是在創建時為其指定原型。 這可以稱為differential inheritanceprototypal 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屬性不是對象的原型。 給定一個函數對象ff.prototype是將被指定為通過new f()構造的所有對象的原型的對象。 對象的真實原型稱為[[prototype]]__proto__但您無法在標准ECMAScript中訪問它們。 令人困惑,是嗎?

作為旁注。 ES5規范具有比Crockford定義的更強的Object.prototype規范。 它需要第二個對象來配置正在定義的對象的屬性。

給定傳遞的對象作為原型,此create方法將實例化一個新對象。

暫無
暫無

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

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