Я использую следующую функцию для определения значений, которые принадлежали конструктору объекта вместо самого объекта.
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 и 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 , чтобы получить ожидаемые результаты?