"Ich dachte, es macht jedes Objekt vom anderen abhängig."
Wie Kyle erklärt, sind zwei Objekte, wenn sie miteinander [[Prototype]]
verbunden sind, nicht wirklich voneinander abhängig. stattdessen sind sie einzelne Objekte. Sie verknüpfen ein Objekt mit dem anderen über eine [[Prototype]]
Verknüpfung, die Sie jederzeit ändern können. Wenn Sie zwei [[Prototype]]
verknüpfte Objekte, die im OLOO-Stil erstellt wurden, als voneinander abhängig betrachten, sollten Sie auch die Objekte berücksichtigen, die durch constructor
Aufrufe erstellt wurden.
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
Jetzt denken für eine Sekunde denken Sie über foo
bar
und baz
wie bei jedem anderen-abhängig zu sein?
Jetzt machen wir dasselbe mit diesem constructor
Stilcode-
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
Der einzige Unterschied b / w der letzteren und dem ersteren Code ist , dass in letzterer ein
foo
, bar
, baz
bbjects zu jedem-seitig durch beliebige Objekte ihrer verknüpft sind constructor
Funktion ( Foo.prototype
, Bar.prototype
, Baz.prototype
) , aber in dem früheren eine ( OLOO
Art) sie direkt miteinander verbunden sind. Beide Wege Sie nur die Verknüpfung foo
, bar
, baz
miteinander, direkt in der ehemaligen ein und indirekt in letzterem ein. In beiden Fällen sind die Objekte jedoch unabhängig voneinander, da es sich nicht wirklich um eine Instanz einer Klasse handelt, die nach der Instanziierung nicht von einer anderen Klasse geerbt werden kann. Sie können jederzeit ändern, welches Objekt ein Objekt auch delegieren soll.
var anotherObj= {};
Object.setPrototypeOf(foo, anotherObj);
Sie sind also alle unabhängig voneinander.
"Ich hatte gehofft OLOO
, das Problem zu lösen, bei dem jedes Objekt nichts über das andere weiß."
Ja das ist ja möglich-
Verwenden wir Tech
als Utility-Objekt-
var Tech= {
tag: "technology",
setName= function(name) {
this.name= name;
}
}
erstellen Sie so viele Objekte wie Sie verknüpft werden soll 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
Glaubst du html
, css
, js
verbunden sind Objekte an alle-andere? Nein, das sind sie nicht. Nun wollen wir sehen, wie wir das mit constructor
function- hätten machen können.
function Tech() { }
Tech.prototype.tag= "technology";
Tech.prototype.setName= function(name) {
this.name= name;
}
erstellen Sie so viele Objekte wie Sie verknüpft werden soll Tech.proptotype
-
var html= new Tech(),
css= new Tech(),
js= new Tech();
Einige Überprüfungen (Vermeidung von 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
Wie denken Sie , diese constructor
-Stil Objects ( html
, css
, js
) unterscheiden sich Objekte aus dem OLOO
-Stil Code? Tatsächlich dienen sie demselben Zweck. Im OLOO
Stil delegieren ein Objekt an Tech
(Delegierung wurde explizit festgelegt), während im constructor
Stil ein Objekt an delegiert wird Tech.prototype
(Delegierung wurde implizit festgelegt). Letztendlich verknüpfen Sie die drei Objekte, die keine Verknüpfung miteinander haben, mit einem Objekt, indem Sie direkt OLOO
-style und indirekt constructor
-style verwenden.
"Wie es ist, muss ObjB aus ObjA erstellt werden. Object.create (ObjB) etc"
Nein, ObjB
hier ist nicht wie eine Instanz (in der klassischen basierten Sprachen) jede Klasse
ObjA
. Es sollte gesagt werden, dass das objB
Objekt zum ObjA
Zeitpunkt der Erstellung an das Objekt delegiert wird. " Wenn Sie den Konstruktor verwendet hätten, hätten Sie dieselbe 'Kopplung' durchgeführt, allerdings indirekt unter Verwendung von .prototype
s.