2016-07-27 43 views
1

Wenn ein Objekt mit einer unbekannten Anzahl von Prototypeltern und einem Eigenschaftsnamen, von dem bekannt ist, dass er auf einem der Eltern implementiert ist, angegeben wird, wie findet man diesen bestimmten Elternknoten am besten?Suchen nach einem Objekt, das die vererbte Eigenschaft bereitstellt

z.

var a = { x: 'foo' }; 
var b = {}; 
var c = { y: 'bar' }; 
var d = { z: 'baz' }; 
var e = {}; 
b.__proto__ = a; 
c.__proto__ = b; 
d.__proto__ = c; 
e.__proto__ = d; 
alert(e.y); // 'bar' 

nur ein Verweis auf e Da möchte ich c finden, da es in dem der Wert von e.y eigentlich herkommt. (Die Objekte werden normal erzeugt; ich verwende in diesem Beispiel nur zu Illustrationszwecken __proto__). In Wirklichkeit kann es eine beliebige Anzahl von Stufen zwischen c und e geben.

(und im Fall hilft es, in Wirklichkeit e ein AngularJS ist $scope, so eine alternative Art und Weise die Frage nach der Gestaltung ist den spezifischen geordneten Bereich zu finden, die eine bestimmte ererbten Umfang Eigenschaft bietet.)

Antwort

0

Meine naive Antwort wäre in etwa wie folgt:

function findOwnProperty(o, p) { 
    while (o) { 
     if (o.hasOwnProperty(p)) { 
      return o; 
     } 
     o = o.__proto__; // or o.$parent for scopes 
    } 
    return null; 
} 

gibt es einen besseren Weg, dies zu tun, oder gibt es etwas, das dies bereits in einiger Bibliothek tut?

+2

Nur für neugierige .. warum haben Sie Ihre Frage zur gleichen Zeit beantwortet, dass Sie gepostet? Könnte es nicht nur eine Bearbeitung Ihrer Frage sein? – developer033

+1

Scheint wie eine Code-Review-Frage, da Sie keine Probleme mit Ihrem Code haben (mutmaßliches Denken). Kann auch eine Antwort auf Jsperf sein. –

+0

Ich denke deine Antwort ist auch falsch, __proto__ ist ein Legacy-Feature, ich würde es nicht verwenden, es gibt Object.getPrototypeOf (obj) – cstuncsik

Verwandte Themen