"J'ai pensé que cela rendait chaque objet dépendant de l'autre"
Comme l'explique Kyle, lorsque deux objets sont [[Prototype]]liés, ils ne dépendent pas vraiment l'un de l'autre; au lieu de cela, ils sont des objets individuels. Vous liez un objet à l'autre avec un [[Prototype]]lien que vous pouvez modifier à tout moment. Si vous considérez que deux [[Prototype]]objets liés créés via le style OLOO sont dépendants l'un de l'autre, vous devez également penser de la même manière à ceux créés via des constructorappels.
var foo= {},
bar= Object.create(foo),
baz= Object.create(bar);
console.log(Object.getPrototypeOf(foo)) //Object.prototype
console.log(Object.getPrototypeOf(bar)) //foo
console.log(Object.getPrototypeOf(baz)) //bar
Maintenant , pensez à un deuxième pensez - vous foo baret bazcomme étant dépendants les uns des -autres?
Maintenant, faisons la même chose avec ce constructorcode de style-
function Foo() {}
function Bar() {}
function Baz() {}
Bar.prototype= Object.create(Foo);
Baz.prototype= Object.create(Bar);
var foo= new Foo(),
bar= new Bar().
baz= new Baz();
console.log(Object.getPrototypeOf(foo)) //Foo.prototype
console.log(Object.getPrototypeOf(Foo.prototype)) //Object.prototype
console.log(Object.getPrototypeOf(bar)) //Bar.prototype
console.log(Object.getPrototypeOf(Bar.prototype)) //Foo.prototype
console.log(Object.getPrototypeOf(baz)) //Baz.prototype
console.log(Object.getPrototypeOf(Baz.prototype)) //Bar.prototype
La seule différence b / w celui - ci et l'ancien code est que dans ce dernier une
foo, bar, bazbbjects sont reliés entre-eux par des objets quelconques de leur constructorfonction ( Foo.prototype, Bar.prototype, Baz.prototype) , mais dans l'ex - one ( OLOOmodèle) , ils sont directement liés. Les deux façons dont vous êtes juste reliant foo, bar, bazentre eux, directement dans l'ancien et indirectement dans le second. Mais, dans les deux cas, les objets sont indépendants les uns des autres car ce n'est pas vraiment comme une instance d'une classe qui, une fois instanciée, ne peut pas être obligée d'hériter d'une autre classe. Vous pouvez toujours modifier l'objet qu'un objet doit également déléguer.
var anotherObj= {};
Object.setPrototypeOf(foo, anotherObj);
Ils sont donc tous indépendants les uns des autres.
"J'espérais OLOOrésoudre le problème dans lequel chaque objet ne sait rien de l'autre."
Oui c'est en effet possible-
Utilisons Techcomme un objet utilitaire-
var Tech= {
tag: "technology",
setName= function(name) {
this.name= name;
}
}
créer autant d'objets que vous souhaitez liés à Tech-
var html= Object.create(Tech),
css= Object.create(Tech),
js= Object.create(Tech);
Some checking (avoiding console.log)-
html.isPrototypeOf(css); //false
html.isPrototypeOf(js); //false
css.isPrototypeOf(html); //false
css.isPrototypeOf(js); //false
js.isPrototypeOf(html); //false
js.isPrototypwOf(css); //false
Tech.isPrototypeOf(html); //true
Tech.isPrototypeOf(css); //true
Tech.isPrototypeOf(js); //true
Pensez - vous que html, css, les jsobjets sont reliés l'un à-autre? Non, ils ne le sont pas. Voyons maintenant comment nous aurions pu faire cela avec la constructorfonction-
function Tech() { }
Tech.prototype.tag= "technology";
Tech.prototype.setName= function(name) {
this.name= name;
}
créer autant d'objets que vous souhaitez liés à Tech.proptotype-
var html= new Tech(),
css= new Tech(),
js= new Tech();
Quelques vérifications (en évitant console.log) -
html.isPrototypeOf(css); //false
html.isPrototypeOf(js); //false
css.isPrototypeOf(html); //false
css.isPrototypeOf(js); //false
js.isPrototypeOf(html); //false
js.isPrototypeOf(css); //false
Tech.prototype.isPrototypeOf(html); //true
Tech.prototype.isPrototypeOf(css); //true
Tech.prototype.isPrototypeOf(js); //true
Comment pensez-vous ces constructorobjets -style ( html, css, js) Les objets diffèrent du OLOOCode de style? En fait, ils servent le même objectif. Dans OLOO-style one objets délègue à Tech(la délégation a été définie explicitement) tandis que dans constructor-style one objets délègue à Tech.prototype(la délégation a été définie implicitement). En fin de compte, vous finissez par lier les trois objets, n'ayant aucun lien les uns avec les autres, à un objet, en utilisant directement OLOO-style, indirectement en utilisant constructor-style.
"En l'état, ObjB doit être créé à partir d'ObjA .. Object.create (ObjB) etc"
Non, ObjBce n'est pas comme une instance (dans les langages classiques) d'une classe quelconque
ObjA. On pourrait dire que l' objBobjet est rendu délégué à l' ObjAobjet au moment de sa création . " Si vous avez utilisé constructeur, vous auriez fait le même 'couplage', bien qu'indirectement en utilisant .prototypes.