"Tôi đã tìm cách làm điều đó khiến mỗi đối tượng phụ thuộc vào đối tượng kia"
Như Kyle giải thích khi hai đối tượng được [[Prototype]]
liên kết, chúng không thực sự phụ thuộc vào nhau; thay vào đó chúng là đối tượng riêng lẻ. Bạn đang liên kết một đối tượng này với một đối tượng khác bằng một [[Prototype]]
liên kết mà bạn có thể thay đổi bất cứ lúc nào bạn muốn. Nếu bạn coi hai [[Prototype]]
đối tượng được liên kết được tạo thông qua kiểu OLOO là phụ thuộc vào nhau, bạn cũng nên nghĩ tương tự về những đối tượng được tạo thông qua constructor
cuộc gọi.
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
Bây giờ, hãy nghĩ trong giây lát, bạn có nghĩ đến foo
bar
vàbaz
phụ thuộc vào nhau không?
Bây giờ chúng ta hãy làm tương tự constructor
mã kiểu này-
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
Chỉ khác biệt b / w sau này và mã cũ là trong một thứ hai
foo
, bar
, baz
bbjects được liên kết với nhau, thông qua đối tượng tùy tiện của họ constructor
function ( Foo.prototype
, Bar.prototype
, Baz.prototype
) nhưng trong một cựu ( OLOO
phong cách) họ được liên kết trực tiếp. Cả hai cách bạn chỉ cần kết nối foo
, bar
, baz
với nhau, trực tiếp trong một cựu tiếp và gián tiếp trong một thứ hai. Tuy nhiên, trong cả hai trường hợp, các đối tượng độc lập với nhau bởi vì nó không thực sự giống như một thể hiện của bất kỳ lớp nào từng được khởi tạo, không thể được thực hiện để kế thừa từ một số lớp khác. Bạn luôn có thể thay đổi đối tượng nào mà một đối tượng cũng sẽ ủy quyền.
var anotherObj= {};
Object.setPrototypeOf(foo, anotherObj);
Vì vậy, tất cả chúng đều độc lập với nhau.
"Tôi đã hy vọng OLOO
sẽ giải quyết được vấn đề mà mỗi đối tượng không biết gì về đối tượng kia."
Vâng, điều đó thực sự có thể-
Hãy sử dụng Tech
như một đối tượng tiện ích-
var Tech= {
tag: "technology",
setName= function(name) {
this.name= name;
}
}
tạo nhiều đối tượng liên kết với bạn muốn 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
Bạn có nghĩ rằng html
, css
, js
đối tượng được kết nối với nhau-khác? Không, họ không. Bây giờ chúng ta hãy xem làm thế nào chúng ta có thể làm điều đó với constructor
hàm-
function Tech() { }
Tech.prototype.tag= "technology";
Tech.prototype.setName= function(name) {
this.name= name;
}
tạo nhiều đối tượng liên kết với bạn muốn Tech.proptotype
-
var html= new Tech(),
css= new Tech(),
js= new Tech();
Một số kiểm tra (tránh 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
Làm thế nào để bạn nghĩ rằng những constructor
đối tượng kiểu ( html
, css
, js
) Đối tượng khác với OLOO
đang kiểu? Trên thực tế, chúng phục vụ cùng một mục đích. Trong OLOO
kiểu một đối tượng ủy quyền cho Tech
(ủy quyền được đặt rõ ràng) trong khi trong constructor
kiểu một đối tượng ủy quyền Tech.prototype
(ủy quyền được đặt ngầm định). Cuối cùng, bạn sẽ liên kết ba đối tượng, không có liên kết với nhau, thành một đối tượng, trực tiếp sử dụng OLOO
-style, gián tiếp sử dụng constructor
-style.
"Như vậy, objB phải được tạo từ objA .. Object.create (ObjB), v.v."
Không, ObjB
ở đây không giống như một thể hiện (trong các ngôn ngữ dựa trên cổ điển) của bất kỳ lớp nào
ObjA
. Có thể nói như objB
đối tượng được thực hiện ủy nhiệm cho ObjA
đối tượng tại thời điểm tạo đối tượng " . Nếu bạn sử dụng hàm tạo, bạn sẽ thực hiện 'ghép' tương tự, mặc dù gián tiếp bằng cách sử dụng .prototype
s.