2012-11-22 53 views
4

我創建了兩個函數A和B做了作爲B的原型jsfiddle對象使用的名字,而不是它的財產

function A(){ 

} 

function B(){ 
    this.name ="Class B"; 
} 

B.prototype = A; 
var b = new B(); 
alert(b.name); // expected Class B got A 

我知道我應該用B.prototype = new A();

是以上行爲預期? 在上面的場景中是否有可能獲得「B類」而不是「A」?

注:我使用上面,因爲A有它A.text = "Text"A.text1 = "Text2"相關的一些財產,我想這些財產可供B.所以B.prototype == A.prototype.不能使用。

+0

'B.prototype = A;'將函數'A'分配給'B'的原型,這可能不是你想要的。 – elclanrs

+0

這種情況似乎並不重要,因爲你可能永遠都不想這樣做,但是,可以在不支持函數上的非標準'.name'屬性的實現中使用''B類''。 –

+0

...雖然看起來很奇怪,你不能指定一個屬性,因爲'this'是對象,而不是原型。 –

回答

0

如果你想BA「繼承」,寫:

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

你是否明白爲什麼代碼的書面行爲如此呢?我很困惑;也許我只是累了:-) – Pointy

+0

解釋爲什麼這比'新的A'好,有什麼缺點,我會給你一個贊成:-) – Bergi

+0

@Pointy看起來,它是不可能影響繼承的「名稱「屬性,如果它屬於一個函數:http://jsfiddle.net/hG64d/1/我不知道爲什麼,我將不得不調查。 –

2

看一看可能的,爲什麼沒有「階級」在JavaScript複製What is the reason to use the 'new' keyword at Derived.prototype = new Base以及在this answer

是的,行爲是預期的。 B.prototype,實例繼承的對象是函數對象A。所以它繼承了name property這是字符串"A"

而且,這個屬性是不變的(它的屬性描述符是{configurable: false, enumerable: false, value: "B", writable: false}),所以當你嘗試新的值賦給b.namethis will check[[CanPut]]返回false - 並沒有任何反應。在嚴格模式下,會拋出Invalid assignment in strict mode TypeError(demo)。

您只能使用Object.defineProperty覆蓋它。


@Edit:我不知道你爲什麼想B繼承這些屬性。它們是構造函數A的「靜態屬性」,它們應該停留在那裏。目前沒有辦法讓函數從Function.prototype以外的其他任何東西繼承,所以要麼複製它們,要麼不使用它們。告訴我們你需要他們什麼,我們可以找到解決方案。

更改函數(和一般對象)的prototype屬性並不會使它們碰巧繼承其他任何東西。函數的prototype屬性指向新創建(構造)的實例將從中繼承的對象。

+0

啊 - 那個屬性是不可變的。杜爾。我現在一直在撓腦袋幾分鐘。 – Pointy

+0

問題是繼承的''name''屬性是不可寫的,所以嘗試用這個名稱創建一個屬性失敗。 –

+0

我只想知道爲什麼原型屬性比自己的屬性更優先? – Anoop

相關問題