我使用以下函数来检测属于对象的构造函数而不是对象本身的值。
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 )
我会得到 Base 而不是预期的 SecondSub ,这本身不是一个大问题,但是......
如果我像这样扩展结果:
result.custom_value = 'custom'
result.another_value = 'another'
我希望能够区分属于结果的值或属于 SecondSub,FirstSub和Base 的值;
例如
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 以生成预期结果?
答案 0 :(得分:4)
我想你可能想回顾一下Douglas Crockford关于JavaScript继承的文章。他在他的书JavaScript: The Good Parts中有一些,有些在他的YUI剧院讲座< http://developer.yahoo.com/yui/theater/>。要将对象属性与派生它们的对象区分开来,请参阅hasOwnProperty()
method。 Crockford似乎认为在JavaScript中使用经典继承是可能的,但不是开发语言功能的最佳方式。也许这将为您提供有关如何解决您想要实现的目标的想法。祝你好运!
Crockford on Inheritance: