新聞中心
我們知道,OOP中最普遍的代碼重用方式是通過(guò)繼承,但是,繼承有一些缺點(diǎn),其中最為主要的是繼承是一種isa關(guān)系,父子類(lèi)之間的關(guān)系太過(guò)緊密,而對(duì)于像JAVA這門(mén)語(yǔ)言而言,只能支持單繼承,使得很多時(shí)候不能不進(jìn)行代碼拷貝這樣的事情。

10余年的扎蘭屯網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整扎蘭屯建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“扎蘭屯網(wǎng)站設(shè)計(jì)”,“扎蘭屯網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
舉個(gè)例子,假設(shè)我們要建模動(dòng)物。最底層是一個(gè)Animal對(duì)象,下面有貓科,犬科。然后貓科下有貓,老虎。犬科下有狗和狼。 貓能夠miao,狗能夠叫,老虎和狼都能夠狩獵,這個(gè)時(shí)候問(wèn)題來(lái)了,由于狩獵這個(gè)特性是老虎和狼都有的,但是老虎以及從貓科繼承,狼已經(jīng)從犬科繼承,它們都已經(jīng)無(wú)法通過(guò)繼承來(lái)獲得狩獵這個(gè)能力了。
讓我們來(lái)看看Trait如何來(lái)解決這個(gè)問(wèn)題。 Trait從表面上看和一個(gè)類(lèi)很類(lèi)似,有屬性和方法,但是它必須依附于一個(gè)類(lèi)才能起作用。同時(shí)多個(gè)Traits可以組合成一個(gè)Trait。如果不同的 Traits中屬性或者方法有沖突的話(huà),可以選擇重命名屬性的方法來(lái)決議沖突。如果沖突沒(méi)有決議的話(huà),組合Traits會(huì)拋出異常。
這樣,類(lèi)層次仍然像前面描述的一樣,我們把狩獵定義為一個(gè)Trait,然后在構(gòu)建老虎和狼的類(lèi)的時(shí)候把Trait融入進(jìn)去。這樣老虎和狼就獲得了狩獵的能力了。
由于Java語(yǔ)言的限制,沒(méi)有一種華麗的方法來(lái)實(shí)現(xiàn)Trait。讓我們來(lái)看看基于原型的Javascript語(yǔ)言如何實(shí)現(xiàn)Trait。這個(gè)其實(shí)從一 個(gè)側(cè)面證明基于原型的Javascript和基于類(lèi)的Java相比,對(duì)于OOP而言更加靈活和強(qiáng)大。為了縮減代碼的大小,這里我使用light- traits這個(gè)JS庫(kù)。因?yàn)橥暾麑?shí)現(xiàn)一個(gè)Traits庫(kù)超出這篇文章的范圍。
- var util = require('util');
- var Trait = require('light-traits').Trait;
- var expect = require('chai').expect;
- var _ = require('lodash');
- function inherits(constructor, parentConstructor, trait, properties) {
- util.inherits(constructor, parentConstructor);
- if (properties !== undefined)
- _.extend(constructor.prototype, properties);
- if (trait !== undefined)
- constructor.prototype = trait.create(constructor.prototype);
- }
- function Animal() {}
- Animal.prototype = {
- isAlive: true,
- eat: function (food) {
- console.log("omnomnom, I'm eating: " + food);
- },
- sleep: function () {
- console.log('zzzz');
- },
- die: function () {
- this.isAlive = false;
- console.log("I'm dead");
- }
- };
- function CatFamily() {}
- inherits(CatFamily, Animal);
- function DogFamily() {}
- inherits(DogFamily, Animal);
- var TMeow = Trait({
- meow: function () {
- console.log('meow meow');
- }
- });
- function Cat() {}
- inherits(Cat, CatFamily, TMeow);
- var cat = new Cat();
- cat.meow();
- var TBark = Trait({
- bark: function () {
- console.log('woof woof');
- }
- });
- function Dog() {}
- inherits(Dog, DogFamily, TBark);
- var dog = new Dog();
- dog.bark();
- var THunt = Trait({
- huntCount: 0,
- hunt: function () {
- console.log('looking for food', this.huntCount++, 'times');
- },
- kill: function (animal) {
- animal.die();
- console.log('I killed animal');
- }
- });
- function Tiger() {}
- inherits(Tiger, CatFamily, THunt, {
- roar: function () {
- console.log("roar...roar...");
- }
- });
- var tiger = new Tiger();
- expect(tiger).to.be.instanceOf(CatFamily);
- expect(tiger).to.have.property('hunt');
- expect(tiger).to.have.property('kill');
- expect(tiger).to.not.have.property('meow');
- expect(tiger.isAlive).to.be.equal(true);
- tiger.hunt();
- tiger.eat('meat');
- tiger.roar();
- function Wolf() {}
- inherits(Wolf, DogFamily, Trait.compose(TBark, THunt));
- var wolf = new Wolf();
- expect(wolf).to.be.instanceOf(DogFamily);
- expect(wolf).to.have.property('hunt');
- expect(wolf).to.have.property('kill');
- expect(wolf).to.have.property('bark');
- expect(wolf.isAlive).to.be.equal(true);
- wolf.bark();
- wolf.hunt();
- wolf.hunt();
- wolf.sleep();
- wolf.kill(cat);
- expect(cat.isAlive).to.be.equal(false);
- expect(wolf.huntCount).to.be.equal(2);
本文名稱(chēng):Javascript中的Trait與代碼重用
當(dāng)前路徑:http://www.dlmjj.cn/article/cdshhog.html


咨詢(xún)
建站咨詢(xún)
