"Bunu yapmanın her nesneyi diğerine bağımlı hale getireceğini düşündüm"
Kyle'ın açıkladığı gibi, iki nesne birbirine [[Prototype]]bağlandığında, bunlar gerçekten birbirine bağımlı değildir; bunun yerine bireysel nesnelerdir. İstediğiniz zaman değiştirebileceğiniz bir bağlantıyla bir nesneyi diğerine [[Prototype]]bağlıyorsunuz. OLOO tarzı ile oluşturulmuş iki [[Prototype]]bağlantılı nesneyi birbirine bağımlı olarak alırsanız, constructoraramalarla oluşturulanlar için de aynı şeyi düşünmelisiniz .
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
Şimdi aklınıza yapmak bir saniye düşünmek foo barvebaz birbirinize bağlı musunuz?
Şimdi aynı constructorstil kodunu yapalım-
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
Tek fark, b / ikinci ve eski kodu ikinci bir o w
foo, bar, bazbbjects kendi keyfi nesneler aracılığıyla her-diğerine bağlanır constructor(fonksiyon Foo.prototype, Bar.prototype,Baz.prototype ), ancak öncekine (içinde OLOOdoğrudan bağlantılıdır tarzı). Sadece bağlıyoruz Her iki yol foo, bar, bazdoğrudan eski birinde ve dolaylı ikinci birinde, birbirleri ile. Ancak, her iki durumda da nesneler birbirinden bağımsızdır çünkü bir kez somutlaştırıldıktan sonra başka bir sınıftan miras alınamayacak herhangi bir sınıfın örneği gibi değildir. Bir nesnenin hangi nesneye yetki vereceğini her zaman değiştirebilirsiniz.
var anotherObj= {};
Object.setPrototypeOf(foo, anotherObj);
Yani hepsi birbirinden bağımsız.
" OLOOHer nesnenin diğeri hakkında hiçbir şey bilmediği sorunu çözeceğimi umuyordum ."
Evet bu gerçekten mümkün-
TechBir yardımcı nesne olarak kullanalım-
var Tech= {
tag: "technology",
setName= function(name) {
this.name= name;
}
}
bağlantı kurmak istediğiniz kadar nesne oluşturun 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
Sizce html, css, jsnesneleri her-diğer bağlanır? Hayır, değiller. Şimdi bunu constructorişlevle nasıl yapabileceğimize bakalım.
function Tech() { }
Tech.prototype.tag= "technology";
Tech.prototype.setName= function(name) {
this.name= name;
}
bağlantı kurmak istediğiniz kadar nesne oluşturun Tech.proptotype-
var html= new Tech(),
css= new Tech(),
js= new Tech();
Biraz kontrol (console.log'dan kaçınarak) -
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
Nasıl bu sizce constructortarzı Nesneleri ( html, css, js) Nesneler farklı OLOOtarzı kod? Aslında aynı amaca hizmet ediyorlar. Gelen OLOOtarzı birine temsilci nesneleri Techiken (heyet açıkça kuruldu) constructortarzı birine temsilci nesneleri Tech.prototype(heyet dolaylı ayarlandı). Sonuçta, birbiriyle hiçbir bağlantısı olmayan üç nesneyi doğrudan kullanarak bir nesneye bağlarsınız.OLOO -stili , dolaylı olarak constructor-stili kullanarak bağlarsınız.
"Olduğu gibi, ObjB ObjA'dan oluşturulmalıdır .. Object.create (ObjB) vb."
Hayır, ObjBburada herhangi bir sınıfın örneği (klasik tabanlı dillerde) değildir
ObjA. Nesnenin, oluşturulduğu anda nesneye delege yapılması gibi söylenebilirobjBObjA . " Eğer yapıcı kullanırsanız, .prototypes kullanarak dolaylı olarak da olsa aynı 'eşleştirme'yi yapardınız .