在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ 關(guān)于js對(duì)象關(guān)聯(lián)風(fēng)格

關(guān)于js對(duì)象關(guān)聯(lián)風(fēng)格

無(wú)語(yǔ),一開始以為各位大神都知道這種風(fēng)格就沒加上代碼,結(jié)果問(wèn)題被踩,貴社區(qū)戾氣真重,佩服佩服。

在看《你不知道的js》的時(shí)候了解了這種代碼風(fēng)格,但是貌似(?)這種代碼風(fēng)格不是特別常見,是因?yàn)檫@種風(fēng)格有什么弊端嗎

以下是對(duì)象關(guān)聯(lián)風(fēng)格&面向?qū)ο箫L(fēng)格的對(duì)比

//典型的(‘原型’)面向?qū)ο箫L(fēng)格
function Foo() {
   this.me = who;
}
Foo.prototype.identify = function() {
     return 'I am '+ this.me;
}
function Bar(who) {
    Foo.call(this, who);
}
Bar.prototype = Object.create(Foo.prototype);
Bar.prototype.speak = function() {
    alert('hello, '+ this.identify() + '.');
};
var b1 = new Bar('b1');
var b2 = new Bar('b2');

b1.speak();
b2.speak();
//子類Bar繼承了父類Foo,然后生成b1和b2的兩個(gè)實(shí)例。b1委托了Bar.prototype。后者委托了Foo.prototype。這種風(fēng)格很常見。
//對(duì)象關(guān)聯(lián)風(fēng)格來(lái)編寫功能完全相同的代碼
Foo = {
     init: function(who) {
          this.me = who;
      },
      identify: function() {
            return 'i am '+ this.me
      }
};
Bar = Object.create(Foo);
Bar.speak = function() {
     alert('hello, '+ this.identify() + '.');
}
var b1 = Object.create(Bar);
b1.init('b1')l
var b2 = Object.create(Bar);
b2.init('b2');
b1.speak();
b2.speak();
//在這段代碼中同樣利用了[[prototype]]把b1委托給Bar并把Bar委托給Foo,和上一段代碼一模一樣。我們?nèi)匀粚?shí)現(xiàn)了三個(gè)對(duì)象之間的關(guān)聯(lián)。在這段代碼中,我們只是把對(duì)象關(guān)聯(lián)起來(lái)了,并不需要那些復(fù)雜又令人困惑的模仿類的行為(構(gòu)造函數(shù),原型以及new)。
回答
編輯回答
安若晴

消消氣消消氣,錯(cuò)在你,不把問(wèn)題描述清楚。

繼承出現(xiàn)最原始的動(dòng)力是復(fù)用代碼。
在這方面,就像你說(shuō)的,如果僅僅是復(fù)用方法,對(duì)象關(guān)聯(lián)肯定更優(yōu)。

那為什么 對(duì)象關(guān)聯(lián) 用的少?
1、沒有正常的對(duì)象識(shí)別關(guān)系
一般認(rèn)為原型指向的是父類,對(duì)象關(guān)聯(lián)不符合這種關(guān)系。
2、平常的需求不單單是繼承方法,還要初始化和繼承屬性。
就像你代碼中的經(jīng)典繼承,Bar 會(huì)繼承 Foo 的屬性,也可以初始化。
對(duì)象關(guān)聯(lián)不可初始化,雖然可以綁定屬性,但在其屬性作為原型都是實(shí)例公共的。

function Bar(who) {
  Foo.call(this, who);
}

3、經(jīng)典繼承看起來(lái)的確比對(duì)象關(guān)聯(lián)高級(jí),誰(shuí)都不想低人一等嘛。
4、大家做繼承根本沒想到直接使用對(duì)象,而習(xí)慣性使用構(gòu)造函數(shù)進(jìn)行繼承。

2018年2月6日 14:22