如何在javascript中找到“原型”值?

时间:2009-05-19 18:30:40

标签: javascript inheritance

我使用以下函数来检测属于对象的构造函数而不是对象本身的值。

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 以生成预期结果?

1 个答案:

答案 0 :(得分:4)

我想你可能想回顾一下Douglas Crockford关于JavaScript继承的文章。他在他的书JavaScript: The Good Parts中有一些,有些在他的YUI剧院讲座< http://developer.yahoo.com/yui/theater/>。要将对象属性与派生它们的对象区分开来,请参阅hasOwnProperty() method。 Crockford似乎认为在JavaScript中使用经典继承是可能的,但不是开发语言功能的最佳方式。也许这将为您提供有关如何解决您想要实现的目标的想法。祝你好运!

Crockford on Inheritance: