「私はそれが各オブジェクトを他のオブジェクトに依存させるようにすることを考えました」
カイルが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
、baz
bbjectsは、それらの任意のオブジェクトを介して、相互に連結されている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
ます。」コンストラクターを使用した場合、.prototype
s を使用することで間接的にではありますが、同じ「カップリング」を行うことになります。