"Я вважав, що це робить кожен об'єкт залежним від іншого"
Як пояснює Кайл, коли два об'єкти [[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
Єдина відмінність ч / б останнього і колишній код є те , що в останньому одному
foo, bar, bazbbjects пов'язані один-одного через довільні об'єкти їх 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-Style об'єктів ( html, css, js) об'єкти відрізняються від OLOO-style коди? Насправді вони служать одній і тій же цілі. В OLOO-style один об’єкт делегується Tech(делегування встановлюється явно), а в constructor-стилі один об'єкт - делегується Tech.prototype(делегування встановлюється неявно). У кінцевому підсумку ви з’єднуєте три об'єкти, не пов’язуючи один одного, з одним об'єктом, безпосередньо використовуючи OLOO-style, опосередковано використовуючи constructor-style.
"Так, ObjB має бути створений з ObjA .. Object.create (ObjB) тощо"
Ні, ObjBтут не схожий на примірник (в класичних мовах) будь-якого класу
ObjA. Можна сказати, що objBоб'єкт робиться делегатом ObjAоб’єкта на час його створення " . Якщо ви використовували конструктор, ви зробили б те саме" зчеплення ", хоча і опосередковано, використовуючи .prototypes.