「私はそれが各オブジェクトを他のオブジェクトに依存させるようにすることを考えました」
カイルが2つのオブジェクトが[[Prototype]]リンクされると説明するように、それらは実際には互いに依存していません。代わりに、それらは個別のオブジェクトです。あるオブジェクトを別のオブジェクトに[[Prototype]]リンクします。リンケージはいつでも変更できます。OLOOスタイルを介して作成された2つの[[Prototype]]リンクされたオブジェクトを相互に依存していると考える場合、constructor呼び出しによって作成されたオブジェクトについても同様に考える必要があります。
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
今、あなたが考えるやる秒で考えるfoo barと、baz、それぞれ、他に依存していると?
今度は同じconstructorスタイルのコードをやってみましょう-
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
後者は前者コードW唯一の違いBは/後者であることが
foo、bar、bazbbjectsは、それらの任意のオブジェクトを介して、相互に連結されているconstructor(関数Foo.prototype、Bar.prototype、Baz.prototype)が、前者(IN OLOOスタイル)は、それらが直接連結されています。あなただけリンクしているどちらかの方法foo、bar、baz直接前者にし、間接的に後者では、お互いに。ただし、どちらの場合でも、オブジェクトは互いに独立しています。これは、一度インスタンス化されると、他のクラスから継承することができないクラスのインスタンスとはあまり似ていないためです。オブジェクトが委任するオブジェクトもいつでも変更できます。
var anotherObj= {};
Object.setPrototypeOf(foo, anotherObj);
つまり、それらはすべて互いに独立しています。
「私はOLOO、各オブジェクトが他のオブジェクトについて何も知らないという問題を解決することを望んでいました。」
はい、それは確かに可能です-
Techユーティリティオブジェクトとして使用しましょう
var Tech= {
tag: "technology",
setName= function(name) {
this.name= name;
}
}
リンクしたいオブジェクトをいくつでも作成できます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
あなたは思いますかhtml、css、jsオブジェクトはそれぞれ、相互に接続されていますか?いいえ、そうではありません。次に、constructor関数でそれを行う方法を見てみましょう。
function Tech() { }
Tech.prototype.tag= "technology";
Tech.prototype.setName= function(name) {
this.name= name;
}
リンクしたいオブジェクトをいくつでも作成できますTech.proptotype-
var html= new Tech(),
css= new Tech(),
js= new Tech();
一部のチェック(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
どのようにこれら思いますconstructorスタイルオブジェクトを(html、css、js)オブジェクトは、異なるOLOOスタイルのコード?実際、それらは同じ目的を果たします。でOLOOスタイルの一つに、デリゲートオブジェクトTechにしながら、(委任が明示的に設定された)constructorスタイルの一つに、デリゲートオブジェクトTech.prototype(委任が暗黙的に設定されました)。最終的に、OLOO-styleを直接使用して間接的に-style を使用して、3つのオブジェクトを相互にリンクせずに1つのオブジェクトにリンクすることになりますconstructor。
「現状のまま、ObjBはObjA .. Object.create(ObjB)などから作成する必要があります」
いいえ、ObjBここはクラスのインスタンス(クラシックベースの言語)とは異なり
ObjAます。作成時にオブジェクトがオブジェクトにデリゲートされるように言うobjBことができObjAます。」コンストラクターを使用した場合、.prototypes を使用することで間接的にではありますが、同じ「カップリング」を行うことになります。