Как мне найти «прототип» значения в JavaScript? - PullRequest
0 голосов
/ 19 мая 2009

Я использую следующую функцию для определения значений, которые принадлежали конструктору объекта вместо самого объекта.

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 , чтобы получить ожидаемые результаты?

1 Ответ

4 голосов
/ 19 мая 2009

Я думаю, что вы, возможно, захотите ознакомиться с работами Дугласа Крокфорда о наследовании в JavaScript. У него есть некоторые в его книге JavaScript: Хорошие части , а некоторые в его лекциях по YUI Theatre <<a href="http://developer.yahoo.com/yui/theater/" rel="nofollow noreferrer">http://developer.yahoo.com/yui/theater/>. Чтобы отличить свойства объектов от свойств объектов, из которых они получены, см. hasOwnProperty() метод . Крокфорд, похоже, утверждает, что использование классического наследования в JavaScript возможно, но это не лучший способ использования языковых возможностей. Возможно, это даст вам идеи о том, как решить, что вы пытаетесь достичь. Желаем удачи, независимо!

Крокфорд по наследству:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...