2009-05-19 7 views
0

J'utilise la fonction suivante pour détecter les valeurs qui appartenaient au constructeur d'un objet au lieu de l'objet lui-même.Comment trouver les valeurs "prototype" en javascript?

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

cela fonctionnerait comme suit:

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 

Mais quand j'ai commencé à utiliser l'héritage:

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

et j'ai appelé

alert(result.constructor) 

je recevrais base au lieu de l'attendre SecondSub, qui est lui-même pas un gros problème, mais ...

si j'étendu résultat comme ceci:

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

I se serait attendu à être capable de distinguer entre les valeurs qui appartiennent à résultat ou les valeurs qui appartiennent à SecondSub, FirstSub et Base;

par ex.

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 

Comment puis-je changer isAPrototypeValue à multiplier les résultats attendus?

Répondre

4

Je pense que vous voudrez peut-être passer en revue l'écriture de Douglas Crockford sur l'héritage en JavaScript. Il a quelques-uns dans son livre JavaScript: The Good Parts, et certains dans ses conférences sur YUI Theatre < http://developer.yahoo.com/yui/theater/>. Pour distinguer les propriétés d'objets de celles des objets dont elles dérivent, voir le hasOwnProperty() method. Crockford semble soutenir que l'utilisation de l'héritage classique en JavaScript est possible, mais pas la meilleure façon d'exploiter les capacités des langages. Peut-être que cela vous donnera des idées sur la façon d'aborder ce que vous essayez d'accomplir. Bonne chance, peu importe!

Crockford sur les successions:

+0

Merci. :) hasOwnProperty() fonctionne comme un charme. – Stefan

Questions connexes