2009-05-19 56 views
0

我用下面的函數來檢測屬於一個對象的構造而不是對象本身的值。如何找到在javascript「原型」值?

function isAPrototypeValue(object, key) { 
    return !(object.constructor && object.constructor.prototype[key]); 
} 

這會工作如下:

Array.prototype.base_value = 'base' 
var array = new Array; 
array.custom_value = 'custom' 
alert(isAPrototypeValue(array, 'base_value')) // true 
alert(isAPrototypeValue(array, 'custom_value')) // false 

,當我開始使用繼承:

function Base() { 
    return this 
}; 
Base.prototype.base_value = 'base'; 

function FirstSub() { 
    return this 
}; 
FirstSub.prototype = new Base(); 
FirstSub.prototype.first_value = 'first'; 

function SubB() { 
    return this 
}; 
SecondSub.prototype = new FirstSub(); 
SecondSub.prototype.second_value = 'second'; 

result = new SecondSub(); 

,我叫

alert(result.constructor) 

我會得到基地而不是預期的SecondSub,這本身不是什麼大問題,但是......

如果我延長結果這樣的:

result.custom_value = 'custom' 
result.another_value = 'another' 

我本來預期能夠屬於結果屬於SecondSub,FirstSub和基地或值的值之間進行區分;

例如。

alert(isAPrototypeValue(result, 'custom_value')) // false (as expected) 
alert(isAPrototypeValue(result, 'base_value')) // true (as expected) 
alert(isAPrototypeValue(result, 'first_value')) // true extend, but it is false 
alert(isAPrototypeValue(result, 'second_value')) // true extend, but it is false 

如何更改isAPrototypeValue生產出預期的效果?

回答

4

我想你可能想要查看道格拉斯Crockford的關於在JavaScript中繼承寫作。他有一些在他的書中JavaScript: The Good Parts,以及一些在他YUI劇院講座< http://developer.yahoo.com/yui/theater/>。從那些從衍生它們的對象的區分對象的屬性,參見hasOwnProperty() method。克羅克福德似乎認爲在JavaScript中使用經典的繼承是可能的,而不是去開發語言能力的最佳途徑。也許這會給你如何去解決你想要完成的想法。無論祝你好運!

克羅克福德上繼承:

+0

謝謝。 :) hasOwnProperty()就像一個魅力。 – Stefan 2009-05-19 18:58:03