“我想这样做会使每个obj相互依赖”
正如凯尔(Kyle)解释的那样,当两个对象[[Prototype]]
链接在一起时,它们并不是真正相互依赖的。相反,它们是个体对象。您正在通过链接将一个对象链接到另一个对象,[[Prototype]]
可以随时更改链接。如果您将[[Prototype]]
通过OLOO样式创建的两个链接对象视为相互依赖,则对于通过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
唯一的区别的B / W后者和前者的代码是在后者
foo
,bar
,baz
bbjects通过它们的任意对象链接到每个-其他constructor
功能(Foo.prototype
,Bar.prototype
,Baz.prototype
),但在前者(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 将三个对象(彼此之间没有链接)链接到一个对象,而间接使用constructor
-style。
“按原样,必须从ObjA创建ObjB。Object.create(ObjB)等”
不,ObjB
这里不像任何类的实例(基于古典语言)
ObjA
。它被前人的精力说喜欢objB
对象是由委托给ObjA
它的创建时间”的对象。如果你使用的构造方法,你会做相同的‘耦合’,虽然间接通过利用.prototype
秒。