Como faço para encontrar valores "protótipo" em javascript?

votos
0

Eu uso a seguinte função para detectar valores que pertenciam a um objeto do construtor em vez do próprio objeto.

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

isso funcionaria da seguinte forma:

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 

Mas quando eu comecei a usar a herança:

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();

e eu chamei

alert( result.constructor ) 

Gostaria de obter Base de Dados em vez do esperado SecondSub , o que em si não é um grande problema, mas ...

se eu estendido resultar assim:

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

Eu teria esperado para ser capaz de distinguir entre os valores que pertencem a resultar ou valores que pertencem a SecondSub, FirstSub e Base de Dados ;

por exemplo.

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

Como posso alterar isAPrototypeValue a produzir os resultados esperados?

Publicado 19/05/2009 em 19:30
fonte usuário
Em outras línguas...                            


1 respostas

votos
4

Eu acho que você pode querer rever a escrita de Douglas Crockford sobre herança em JavaScript. Ele tem algum em seu livro JavaScript: The Good Parts , e alguns em suas palestras sobre YUI Theater < http://developer.yahoo.com/yui/theater/ >. Para distinguir propriedades objectos das dos objectos a partir do qual eles são derivados, ver o hasOwnProperty()método . Crockford parece argumentar que o uso de herança clássica em JavaScript é possível, mas não é a melhor maneira de ir sobre explorando as capacidades de idiomas. Talvez isso vai lhe dar idéias sobre como proceder para abordar o que você está tentando realizar. Melhor da sorte, independentemente!

Crockford sobre Herança:

Respondeu 19/05/2009 em 19:49
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more