JavaScript中的面向?qū)ο缶幊?/h1>

學(xué)習(xí)JavaScript語(yǔ)言的過(guò)程中“面向?qū)ο蟆钡母拍罱^對(duì)是一道坎迹栓。JS沒(méi)有“類”這個(gè)概念顷啼,因此要用它來(lái)進(jìn)行面向?qū)ο缶幊叹托枰乱环Ψ虼础R环矫妫覀冃枰盐認(rèn)avaScript語(yǔ)言自身的風(fēng)格和特點(diǎn)孽糖;另一方面枯冈,我們需要重新理解面向?qū)ο蟮娜笠亍0选罢Z(yǔ)言特性”和“三大要素”牢牢的記在心中办悟,然后再去理解JavaScript面向?qū)ο缶幊叹鸵菀椎枚喑咀唷_@篇文章將對(duì)JS面向?qū)ο缶幊痰暮诵臋C(jī)制進(jìn)行梳理和總結(jié)。歸納了幾種常見(jiàn)的定義類的方式以及如何建立類之間的繼承關(guān)系誉尖。

一. 兩個(gè)關(guān)鍵概念

“萬(wàn)物皆對(duì)象”是JS的一個(gè)很重要的特點(diǎn)罪既,在JavaScript中,你定義的數(shù)組,鍵值對(duì)琢感,整數(shù)丢间,字符串和浮點(diǎn)數(shù)等其實(shí)都是對(duì)象,連函數(shù)都是一個(gè)對(duì)象驹针,所不同的只是它可以被調(diào)用而已烘挫。這一點(diǎn)跟Python就很像,這就是為什么你可以在JS數(shù)組中放入各種不同類型的元素的原因柬甥,這在強(qiáng)類型語(yǔ)言中是不可能做到的饮六。請(qǐng)注意,理解這個(gè)關(guān)鍵概念對(duì)后面理解JavaScript面向?qū)ο缶幊?strong>至關(guān)重要:

  • 在JavaScript中苛蒲,萬(wàn)物皆對(duì)象卤橄;
  • 在JavaScript中,函數(shù)是一個(gè)可以被調(diào)用的特殊對(duì)象臂外。

幾乎所有的面向?qū)ο笳Z(yǔ)言都有動(dòng)態(tài)引用當(dāng)前對(duì)象的方法窟扑,JS也不例外。這就是this關(guān)鍵字漏健。this關(guān)鍵字與函數(shù)調(diào)用密切相關(guān)嚎货,所不同于其他語(yǔ)言的是JS中的this關(guān)鍵字比較靈活,有很多種綁定規(guī)則蔫浆,容易把人繞暈殖属。而且this關(guān)鍵字在類的定義中頻繁用到,如果再加上JS因?yàn)闆](méi)有“類”的概念而弄出的各種奇葩定義方式就更暈了瓦盛。

要理解面向?qū)ο蟮腏S就必須先理解this關(guān)鍵字洗显,要理解this關(guān)鍵字就必須把握一個(gè)關(guān)鍵法則,我稱它為“調(diào)用時(shí)法則”——直到函數(shù)調(diào)用的那一刻this關(guān)鍵字的綁定才被確定谭溉。有5種情況:

1. 函數(shù)作為方法

當(dāng)函數(shù)作為對(duì)象方法被調(diào)用時(shí)墙懂,在調(diào)用的那一刻this關(guān)鍵字被綁定到當(dāng)前對(duì)象上:

var obj = {
  fn: function(a, b) {
    console.log(this);
  }
};
// this --> obj
obj.fn(3, 4);

2. 函數(shù)直接調(diào)用

當(dāng)函數(shù)被直接調(diào)用時(shí)橡卤,this被綁定到global對(duì)象:

var fn = function(one, two) {
  console.log(this, one, two);
};
var g={}, b={};
// this --> global
fn(g, b);

3. Functional.prototype.call

如果我們希望函數(shù)在直接被調(diào)用時(shí)顯式指定this關(guān)鍵字的綁定扮念,那么我們可以使用函數(shù)對(duì)象特有的call()方法:

var fn = function(one, two) {
  console.log(this, one, two);
};
var r={}, g={}, b={};
// this --> r
fn.call(r, g, b);

4. 作為回調(diào)函數(shù)

作為回調(diào)函數(shù)傳入其他函數(shù)中時(shí),由于其他函數(shù)會(huì)直接調(diào)用該回調(diào)函數(shù)碧库,因此this關(guān)鍵字仍然被綁定為global對(duì)象柜与,就算傳入的是某個(gè)對(duì)象的方法也是如此——還記得嗎?this關(guān)鍵字的綁定只有在調(diào)用時(shí)才被確定:

// this --> global
setTimeout(r.method, 1000);

如果需要保留對(duì)象信息嵌灰,可以采取這樣的方式弄匕,用一個(gè)匿名函數(shù)將其“包裹”起來(lái):

setTimeout(function() { 
  r.method(); 
}, 1000);

5. 與new操作符一起使用

與new操作符一起使用時(shí),this關(guān)鍵字將被綁定為新創(chuàng)建的對(duì)象沽瞭,在JS中定義類時(shí)會(huì)大量用到這樣的方法:

var Car = function(loc) {
  this.loc = loc;
}
// this --> a brand new object
var c = new Car(2);

二. 面向?qū)ο蟮腏avaScript

關(guān)鍵概念鋪墊完了迁匠,下面我們正式進(jìn)入正題,看看JS是怎么定義類的。以上我們了解了語(yǔ)言特性城丧,下面我們就來(lái)復(fù)習(xí)一下什么是“面向?qū)ο蟆毖邮铩D敲磫?wèn)題來(lái)了,當(dāng)我們說(shuō)“面向?qū)ο蟆钡臅r(shí)候亡哄,我們究竟在說(shuō)什么枝缔?

1. 三大要素

面向?qū)ο缶幊逃腥笠兀悍庋b,繼承和多態(tài)蚊惯≡感叮“封裝(encapsulation)”就是將數(shù)據(jù)和與數(shù)據(jù)有關(guān)的操作封裝起來(lái),定義成一個(gè)“類”截型,以實(shí)現(xiàn)對(duì)問(wèn)題領(lǐng)域的建模趴荸。比如定義一個(gè)類Car代表汽車(chē),封裝一些常見(jiàn)的數(shù)據(jù)宦焦,比如速度赊舶,重量和長(zhǎng)度等,形成屬性赶诊,再封裝一些操作笼平,比如“啟動(dòng)”,“行駛”和“停止”等舔痪,形成方法寓调。那么汽車(chē)有很多種,有貨車(chē)锄码,卡車(chē)夺英,公交車(chē)和轎車(chē)等等,不同的類型有一些自己特有的屬性滋捶,那么就需要通過(guò)“繼承(inheritance)”來(lái)模擬這種關(guān)系痛悯,“繼承”也是代碼重用的一種有效的抽象方式。雖然都是汽車(chē)重窟,都具有“啟動(dòng)”载萌,“行駛”和“停止”等方法,但不同種類車(chē)輛有自己的操作方式巡扇,它們共享同樣的“接口”(比如都具有“啟動(dòng)”的方法)但實(shí)現(xiàn)方式不一樣扭仁,我們稱這種多樣的行為為“多態(tài)(polymorphism)”。

以上就是掌握J(rèn)S面向?qū)ο缶幊痰乃嘘P(guān)鍵概念厅翔,再次強(qiáng)調(diào)乖坠,這些概念對(duì)于理解下面要介紹的內(nèi)容至關(guān)重要〉睹疲總結(jié)一下熊泵,有如下4點(diǎn):

  • 在JavaScript中仰迁,萬(wàn)物皆對(duì)象;
  • 在JavaScript中顽分,函數(shù)是一個(gè)可以被調(diào)用的特殊對(duì)象轩勘;
  • this關(guān)鍵字直到調(diào)用時(shí)才被確定綁定到哪個(gè)對(duì)象;
  • 面向?qū)ο笕兀悍庋b怯邪,繼承和多態(tài)绊寻;

2. JavaScript中定義類的模式

深刻理解這4個(gè)概念之后JS面向?qū)ο缶幊讨兄T多晦澀難懂的概念將迎刃而解。簡(jiǎn)單的說(shuō)悬秉,對(duì)象其實(shí)就是鍵值對(duì)澄步,類似與Python中的dict,Go語(yǔ)言中的map和泌,因此最簡(jiǎn)單的情況下村缸,如果我需要一個(gè)對(duì)象,那么其實(shí)我不需要定義類武氓,直接定義對(duì)象就好了:

var amy = {loc: 1};
amy.loc++;
var ben = {loc: 9};
ben.loc++;

但是對(duì)象如果有成千上百個(gè)梯皿,這么定義也不是個(gè)事兒,要寫(xiě)很多重復(fù)代碼县恕。要實(shí)現(xiàn)最基本的代碼重用东羹,就需要把創(chuàng)建對(duì)象的過(guò)程抽象出來(lái)。在JS中這種抽象往往通過(guò)定義一個(gè)函數(shù)來(lái)實(shí)現(xiàn)忠烛,這也可以說(shuō)是JS特有的一類構(gòu)造型模式了属提。比如“對(duì)象修飾器模式(object decorator pattern)”。

1)對(duì)象修飾器模式

對(duì)象修飾器模式的一大特點(diǎn)是修飾器本身并不創(chuàng)建對(duì)象美尸。我們將創(chuàng)建好的對(duì)象傳遞給修飾器冤议,讓修飾器為對(duì)象添加新的屬性然后返回:

var carLike = function(obj, loc) {
  obj.loc = loc;
  obj.move = function() {
    this.loc++; // *根據(jù)this關(guān)鍵字綁定規(guī)則,它將被綁定到被調(diào)用的對(duì)象上
  };
  return obj;
}

這種創(chuàng)建對(duì)象的方式還不夠省心师坎,如果我們要求函數(shù)自己創(chuàng)建對(duì)象并返回恕酸,那么它就不叫修飾器了,叫“函數(shù)類(functional class)”胯陋。

2)函數(shù)類模式

函數(shù)類模式定義的函數(shù)一般大寫(xiě)蕊温,以顯示它的特殊性:它會(huì)創(chuàng)建對(duì)象,添加屬性惶岭,然后返回:

var Car = function(loc) {
  var obj = {};
  obj.loc = loc;
  obj.move = function() {
    obj.loc++;
  };
  return obj;
};

如果將定義好的函數(shù)和new運(yùn)算符結(jié)合起來(lái)使用寿弱,我們還可以把代碼寫(xiě)的更簡(jiǎn)單些犯眠,這就誕生了一個(gè)新的模式按灶,叫做“構(gòu)造器模式(constructor pattern)”。

3)構(gòu)造器模式

使用new運(yùn)算符時(shí)筐咧,JS解釋器會(huì)默默地在函數(shù)一頭一尾處分別幫你添加一行代碼鸯旁,這樣代碼看起來(lái)就更簡(jiǎn)潔噪矛,更像一般意義上的構(gòu)造函數(shù)定義:

var Car = function(loc) {
  // this = Object.create(Car.prototype); <-- 解釋器隱式添加
  this.loc = loc;
  this.move = function() {
    this.loc++;
  };
  // return this; <-- 解釋器隱式添加
};

以上三種模式都有個(gè)共同的弊端——每次創(chuàng)建新對(duì)象時(shí)都會(huì)創(chuàng)建新的函數(shù)對(duì)象move,但函數(shù)的功能是相同的铺罢,其實(shí)沒(méi)必要反復(fù)拷貝艇挨,因此這兩種模式只做到了代碼重用,并沒(méi)有做到真正的effective code reuse韭赘。創(chuàng)建的對(duì)象多了開(kāi)銷(xiāo)會(huì)很大缩滨。如果要讓創(chuàng)建的對(duì)象共享屬性和方法,可以通過(guò)“原型模式(prototype pattern)”實(shí)現(xiàn)泉瞻。

4)原型模式

原型模式通過(guò)將屬性和方法都定義到構(gòu)造函數(shù)的prototype對(duì)象上來(lái)實(shí)現(xiàn):

function Car() {}
Car.prototype.loc = 1;
Car.prototype.move = function() {
    this.loc++;
};
var c = new Car();
var d = new Car();

此時(shí)對(duì)象c和對(duì)象d都共享同一套屬性和方法:loc屬性和move方法脉漏。確切地說(shuō)是所有由Car()創(chuàng)建的對(duì)象都會(huì)擁有同一個(gè)loc屬性和move方法,這就避免了重復(fù)拷貝同一個(gè)函數(shù)對(duì)象袖牙。原型模式分別與函數(shù)類模式侧巨、構(gòu)造器模式組合形成了“原型類模式(prototype class)”和“偽類模式(pseudo class)”。

5)原型類模式

原型類模式是函數(shù)類模式和原型模式的結(jié)合鞭达。我們用函數(shù)類來(lái)創(chuàng)建實(shí)例并添加屬性司忱,然后用原型對(duì)象來(lái)存儲(chǔ)所有的共享方法,并把所創(chuàng)建的實(shí)例委托給原型對(duì)象:

var Car = function(loc) {
  var obj = Object.create(Car.prototype);
  obj.loc = loc;
  reurn obj;
};
Car.prototype.move = function() {
  this.loc++;
};

這樣一來(lái)畴蹭,每個(gè)實(shí)例都有自己的loc屬性坦仍,但它們都通過(guò)原型對(duì)象共享同一個(gè)函數(shù)對(duì)象move。如果你仔細(xì)對(duì)比上面這段代碼和前面介紹的構(gòu)造器模式里的代碼叨襟,就會(huì)發(fā)現(xiàn)它們其實(shí)是大同小異的桨踪。只需要一點(diǎn)點(diǎn)改進(jìn)和優(yōu)化,原型類模式就變成了偽類模式芹啥。

6)偽類模式

使用原型類模式定義的類是這樣的:

var Car = function(loc) {
  var obj = Object.create(Car.prototype);
  obj.loc = loc;
  reurn obj;
};
Car.prototype.move = function() {
  this.loc++;
};

而使用構(gòu)造器模式定義的類是這樣的:

var Car = function(loc) {
  // this = Object.create(Car.prototype); <-- 解釋器隱式添加
  this.loc = loc;
  this.move = function() {
    this.loc++;
  };
  // return this; <-- 解釋器隱式添加
};

注釋是關(guān)鍵锻离!可以看到在使用new運(yùn)算符創(chuàng)建對(duì)象時(shí),解釋器自動(dòng)幫我們生成了這兩行代碼墓怀,因此汽纠,我們可以把原型類模式的代碼改寫(xiě)成下面這樣:

var Car = function(loc) {
  this.loc = loc;
};
Car.prototype.move = function() {
  this.loc++;
};

當(dāng)我們使用var car = new Car(5);來(lái)定義新的實(shí)例時(shí),該實(shí)例就自動(dòng)將move方法委托給了Car.prototype對(duì)象傀履,當(dāng)我們調(diào)用car.move()時(shí)虱朵,由于car本身不包括move()方法(還記得嗎,對(duì)象只不過(guò)是鍵值對(duì)而已)钓账,此時(shí)就會(huì)到Car.prototype中去查找碴犬,找到了,于是便執(zhí)行該函數(shù)梆暮。結(jié)合上面的討論可以知道此時(shí)this關(guān)鍵字被綁定給了car對(duì)象服协,因此改變的就是對(duì)象car的loc屬性。這種對(duì)象之間通過(guò)原型對(duì)象形成鏈?zhǔn)疥P(guān)系啦粹,逐步向上查找的機(jī)制就是JS中的“原型鏈(prototype chain)”偿荷。它就像一個(gè)鏈表窘游,JS中所有對(duì)象都有一個(gè)頂層原型對(duì)象Object.prototype它包括了所有對(duì)象共享的方法,比如toString()跳纳。根據(jù)“萬(wàn)物皆對(duì)象”的特性忍饰,所有的數(shù)組都是特殊對(duì)象,數(shù)組共享的方法委托給了Array.prototype原型寺庄;所有的函數(shù)也都是特殊對(duì)象艾蓝,函數(shù)共享的方法委托給了Function.prototype。

arr --> Array.prototype --> Object.prototype
fn --> Function.prototype --> Object.prototype

偽類模式是所有模式中最高效簡(jiǎn)潔的模式斗塘,因此推薦使用它來(lái)定義類饶深,但是光有類,沒(méi)有繼承關(guān)系肯定也不行逛拱,下面我們就來(lái)重點(diǎn)看看偽類模式下如何建立類之間的繼承關(guān)系敌厘。

3. 偽類模式下實(shí)現(xiàn)類之間的繼承關(guān)系

比如現(xiàn)在我們要定義一個(gè)類Van表示貨車(chē),它是Car的子類朽合,擁有自己特有的方法grab俱两。可以通過(guò)4個(gè)分解步驟來(lái)實(shí)現(xiàn):

  1. 繼承超類的屬性曹步;
  2. 繼承超類的方法宪彩;
  3. 恢復(fù)原型的構(gòu)造函數(shù)屬性;
  4. 定義自己特有的方法讲婚;

1)繼承超類的屬性

我們需要在子類的上下文環(huán)境中以一種特殊的方式去調(diào)用超類構(gòu)造函數(shù)來(lái)繼承超類的屬性尿孔。方法就是使用Function.prototype.call():

var Van = function(loc) {
  Car.call(this, loc);
};

根據(jù)上面介紹的綁定規(guī)則,執(zhí)行new Van(5);時(shí)this關(guān)鍵字被綁定到新創(chuàng)建的Van實(shí)例上筹麸,然后該實(shí)例被傳給了Car函數(shù)活合,在Car函數(shù)中的this即Van實(shí)例,因此Van的實(shí)例從Car那里繼承了loc屬性物赶。

2)繼承超類的方法

回想一下白指,超類Car的方法被委托給了Car.prototype對(duì)象,因此才實(shí)現(xiàn)了所有Car的實(shí)例共享同一套函數(shù)對(duì)象酵紫,當(dāng)調(diào)用實(shí)例方法時(shí)告嘲,會(huì)通過(guò)原型鏈機(jī)制鏈?zhǔn)讲檎液瘮?shù)對(duì)象并調(diào)用。因此如果Van想要繼承Car的方法奖地,那么它也需要將自己的原型對(duì)象委托給Car.prototype橄唬。怎么委托呢?通過(guò)Object.create()方法:

var Van = function(loc) {
  Car.call(this, loc);
};
Van.prototype = Object.create(Car.prototype);

這樣便建立了鏈?zhǔn)疥P(guān)系参歹,Van的實(shí)例現(xiàn)在可以通過(guò)原型鏈機(jī)制調(diào)用move函數(shù)了仰楚,你可能會(huì)很好奇,到底Object.create()是怎么建立這層關(guān)系的呢泽示?看一下Crockford大神的Object.create()實(shí)現(xiàn)你就知道了:

 if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        // 臨時(shí)構(gòu)造器
        function F() {
        }
?        // 所有F構(gòu)造器創(chuàng)建的實(shí)例都將自己的原型委托給對(duì)象o
        F.prototype = o;
        // 返回F類的對(duì)象
        return new F();
    };
}

這下明白了缸血,原來(lái)Van.prototype = Object.create(Car.prototype);就是將Van.prototype替換成了一個(gè)新的對(duì)象f蜜氨,而f將自己的原型委托給了Car.prototype對(duì)象械筛。一旦有v.move()這樣的調(diào)用捎泻,就會(huì)先在v這個(gè)鍵值對(duì)中查找move對(duì)象,發(fā)現(xiàn)找不到埋哟,于是通過(guò)Van自己的prototype對(duì)象到Car.prototype中去查找笆豁,找到了!于是執(zhí)行赤赊。

3)恢復(fù)原型的構(gòu)造函數(shù)屬性

上面這段代碼有個(gè)小問(wèn)題闯狱,仔細(xì)看看Object.create()的實(shí)現(xiàn)就會(huì)發(fā)現(xiàn),此時(shí)我們的Van.prototype實(shí)際上是一個(gè)新對(duì)象f抛计,而f除了有一個(gè).prototype屬性指向Car.prototype之外就什么都沒(méi)有了哄孤,缺了什么?缺了構(gòu)造函數(shù)吹截!原來(lái)Van.prototype是有一個(gè)constructor屬性的瘦陈,該屬性存儲(chǔ)的就是Van本身——通過(guò)它我們可以知道Van的對(duì)象都是由哪個(gè)構(gòu)造函數(shù)實(shí)現(xiàn)的。現(xiàn)在沒(méi)有了波俄,意味著根據(jù)原型鏈法則晨逝,我們會(huì)到Car.prototype中去尋找構(gòu)造函數(shù),是Car()函數(shù)本身懦铺,這是不對(duì)的捉貌,因此我們需要恢復(fù)自己的構(gòu)造函數(shù):

var Van = function(loc) {
  Car.call(this, loc);
};
Van.prototype = Object.create(Car.prototype);
Van.prototype.constructor = Van;

4)定義自己特有的方法

關(guān)鍵步驟完成之后,我們終于可以定義自己特有的方法了:

var Van = function(loc) {
  Car.call(this, loc);
};
Van.prototype = Object.create(Car.prototype);
Van.prototype.constructor = Van;
Van.prototype.grab = function() {
  /**/
};

此時(shí)如果我們覺(jué)得Car原先實(shí)現(xiàn)的move函數(shù)不滿足Van的實(shí)際情況冬念,我們也可以定義一個(gè)move函數(shù):

var Van = function(loc) {
  Car.call(this, loc);
};
Van.prototype = Object.create(Car.prototype);
Van.prototype.constructor = Van;
Van.prototype.grab = function() {
  /**/
};
Van.prototype.move = function() {
  /* new implementation of move() */ 
};

這樣一來(lái)趁窃,根據(jù)原型鏈法則,當(dāng)調(diào)用v.move()時(shí)會(huì)先在v身上查找急前,發(fā)現(xiàn)找不到棚菊,于是到Van.prototype中查找,找到了叔汁!就不會(huì)繼續(xù)向上回溯到Car.prototype据块。這不就是“多態(tài)”嗎另假?對(duì)了边篮,JS的多態(tài)就是通過(guò)原型鏈機(jī)制和this關(guān)鍵字的調(diào)用時(shí)綁定實(shí)現(xiàn)的。與此相關(guān)的是instanceof運(yùn)算符。你常常會(huì)在代碼中看到car instanceof Car這樣的調(diào)用挠进。instanceof運(yùn)算符的工作機(jī)制是:它會(huì)檢查Car.prototype有沒(méi)有出現(xiàn)在car的原型鏈中领突,如果有就返回true君旦,否則就返回false金砍。

三. 也談理解和把握復(fù)雜概念的方法

一生俯首拜陽(yáng)明

《傳習(xí)錄》中曾記錄過(guò)一個(gè)著名的公案捞魁,叫做“巖中花”:

先生游南鎮(zhèn)离咐。一友指巖中花樹(shù)問(wèn)曰“天下無(wú)心外物宵蛀。如此花樹(shù),在深山中自開(kāi)自落凑懂,于我心亦何相關(guān)接谨?”
先生曰:“你未看此花時(shí)脓豪,此花與汝心同歸于寂。你來(lái)看此花時(shí)笤闯,則此花顏色一時(shí)明白起來(lái)颗味。便知此花不在你的心外脱衙【韬”

你沒(méi)有看到這朵花時(shí),它對(duì)你是沒(méi)有意義的鹃锈,你甚至都不知道它的存在。而當(dāng)你看到這朵花時(shí)仅政,它的形狀,顏色就一下子出現(xiàn)在你的心中了盆驹,你就知道,哦躯喇!這是一朵花辫封。

陸王心學(xué)講究“心外無(wú)物”,“心即理”倦微,“圣人之道欣福,吾性自足”拓劝,“吾心即宇宙郑临,宇宙即吾心”价脾。這講的其實(shí)是一種“價(jià)值存在”而不是“物理存在”。我們當(dāng)然知道犀变,如果我們沒(méi)有看到這朵花妹孙,或者沒(méi)有接觸前端開(kāi)發(fā)的知識(shí),那么這朵花或者說(shuō)這些面向?qū)ο髾C(jī)制仍然是存在的获枝,只是它的存在對(duì)我們沒(méi)有價(jià)值意義而已蠢正。而一旦接觸它們,它們就具有了價(jià)值省店,就不在我們的心外嚣崭。所以我們要去“致良知”,要去弄懂它到底是怎么運(yùn)作的懦傍,抓住它的關(guān)鍵和本質(zhì):JS其實(shí)就是用鍵值對(duì)去模擬面向?qū)ο蟮姆庋b雹舀,繼承和多態(tài)!一旦抓住這個(gè)中心粗俱,復(fù)雜的概念就迎刃而解了——所謂八仙過(guò)海各顯神通说榆,那些千奇百怪的實(shí)現(xiàn)方式只不過(guò)都是想方設(shè)法通過(guò)鍵值對(duì)來(lái)建立面向?qū)ο蟮臋C(jī)制罷了,萬(wàn)變不離其宗寸认!

由此可以產(chǎn)生一個(gè)觀念上的轉(zhuǎn)變签财,即我們做任何事情,要堅(jiān)持價(jià)值判斷而不是利益判斷偏塞,這樣我們才能走的更遠(yuǎn)唱蒸。拿打王者榮耀來(lái)舉例,如果我們心里揣著的是利益判斷灸叼,那么我們追逐的就是個(gè)人利益神汹,就會(huì)糾結(jié)自己能拿對(duì)方多少個(gè)人頭,會(huì)不會(huì)被殺死很多次怜姿,這局打完能不能獲得MVP什么的慎冤,在玩游戲的時(shí)候要么過(guò)于沖動(dòng),要么不敢把握機(jī)會(huì)沧卢,最后反而輸?shù)目赡苄愿笠系獭6绻覀冃睦锎е氖莾r(jià)值判斷,那么我們會(huì)更多地思考如何配合隊(duì)友但狭,怎樣提高自己的技戰(zhàn)術(shù)披诗,進(jìn)而多花心思了解對(duì)方,了解自己立磁,做到知己知彼呈队,反而可能贏的概率更高。這就是思維的轉(zhuǎn)變唱歧,這就是心學(xué)的力量宪摧。

白起

身在黑暗粒竖,心向光明。

四. 參考資料

  1. 面向?qū)ο蟮?Javascript 編程
  2. Object-oriented JavaScript for beginners
  3. Inheritance in JavaScript
  4. OOP In JavaScript: What You NEED to Know
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者

  • 序言:七十年代末几于,一起剝皮案震驚了整個(gè)濱河市蕊苗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沿彭,老刑警劉巖朽砰,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異喉刘,居然都是意外死亡瞧柔,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)睦裳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)造锅,“玉大人,你說(shuō)我怎么就攤上這事推沸”刚溃” “怎么了券坞?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵鬓催,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我恨锚,道長(zhǎng)宇驾,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任猴伶,我火速辦了婚禮课舍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘他挎。我一直安慰自己筝尾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布办桨。 她就那樣靜靜地躺著筹淫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呢撞。 梳的紋絲不亂的頭發(fā)上损姜,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音殊霞,去河邊找鬼摧阅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绷蹲,可吹牛的內(nèi)容都是我干的棒卷。 我是一名探鬼主播顾孽,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼比规!你這毒婦竟也來(lái)了岩齿?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤苞俘,失蹤者是張志新(化名)和其女友劉穎盹沈,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吃谣,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乞封,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了岗憋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肃晚。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖仔戈,靈堂內(nèi)的尸體忽然破棺而出关串,到底是詐尸還是另有隱情,我是刑警寧澤监徘,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布晋修,位于F島的核電站,受9級(jí)特大地震影響凰盔,放射性物質(zhì)發(fā)生泄漏墓卦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一户敬、第九天 我趴在偏房一處隱蔽的房頂上張望落剪。 院中可真熱鬧,春花似錦尿庐、人聲如沸忠怖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凡泣。三九已至,卻和暖如春锐借,著一層夾襖步出監(jiān)牢的瞬間问麸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工钞翔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留严卖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓布轿,卻偏偏與公主長(zhǎng)得像哮笆,于是被迫代替她去往敵國(guó)和親来颤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容