"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 constructor
appels.
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
bar
et baz
comme étant dépendants les uns des -autres?
Maintenant, faisons la même chose avec ce constructor
code 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
, baz
bbjects sont reliés entre-eux par des objets quelconques de leur constructor
fonction ( Foo.prototype
, Bar.prototype
, Baz.prototype
) , mais dans l'ex - one ( OLOO
modèle) , ils sont directement liés. Les deux façons dont vous êtes juste reliant foo
, bar
, baz
entre 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 OLOO
résoudre le problème dans lequel chaque objet ne sait rien de l'autre."
Oui c'est en effet possible-
Utilisons Tech
comme 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 js
objets sont reliés l'un à-autre? Non, ils ne le sont pas. Voyons maintenant comment nous aurions pu faire cela avec la constructor
fonction-
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 constructor
objets -style ( html
, css
, js
) Les objets diffèrent du OLOO
Code 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, ObjB
ce n'est pas comme une instance (dans les langages classiques) d'une classe quelconque
ObjA
. On pourrait dire que l' objB
objet est rendu délégué à l' ObjA
objet au moment de sa création . " Si vous avez utilisé constructeur, vous auriez fait le même 'couplage', bien qu'indirectement en utilisant .prototype
s.