2012-11-24 20 views
0

可能重複:
Why is it necessary to set the prototype constructor?正在設置正確的JS繼承所需的'構造函數'屬性?

我掙扎理解構建一個層次時,一個JavaScript對象的構造函數「屬性設置爲子類的必要性。我發現下面的代碼在不改變構造函數屬性的情況下做了什麼,但幾乎在所有關於構造函數被明確設置的主題中找到了引用。我錯過了什麼嗎? (我沒有在ECMAScript規範中明確使用它)。

A = function() { 
    this.value = "a"; 

    this.A = function() { 
     window.alert(this.value + " instanceof A : " + (this instanceof A)); 
    } 
} 


B = function() { 
    this.value = "b"; 

    this.B = function() { 
     window.alert(this.value + " instanceof B : " + (this instanceof B)); 
    } 
} 

B.prototype = new A(); 

test = function() { 
    var b = new B(); 
    b.A(); 
    b.B(); 
} 

回答

1

首先,適當的JS繼承意味着在原型推杆方法:

var A = function() { 
    this.value = "a"; 
}; 

A.prototype.A = function() { 
     window.alert(this.value + " instanceof A : " + (this instanceof A)); 
}; 

var B = function() { 
    this.value = "b"; 
}; 

其次,不要運行構造函數建立一個原型鏈時:

B.prototype = Object.create(A.prototype); 

每當你重新分配整個.prototype,你完全覆蓋了這個對象。所以構造 物業的需求(如果它要被使用)被重新分配:

B.prototype.constructor = B; 

B.prototype.B = function() { 
    window.alert(this.value + " instanceof B : " + (this instanceof B)); 
}; 

Object.create在舊的瀏覽器不支持,但你可以這樣做:

Object.create = Object.create || function(proto) { 
    if(proto == null) { 
     return {}; 
    } 
    function f(){} 
    f.prototype = proto; 
    return new f(); 
}; 
+2

這是唯一需要設置如果你的代碼有一些使用它的期望,'constructor'屬性。我個人覺得它完全沒用。 –

+0

@TimDown不一定是你的代碼,iirc,es5-shim需要爲'getPrototypeOf'設置構造函數屬性。 – Esailija

+0

那不是一個適當的填充。 –