繼承

1.偽類 構(gòu)造器繼承

var Person = function (name) {
    this.name = name;
}
Person.prototype.getName = function () {
    return this.name;
}
Person.prototype.getSaying = function () {
    return this.saying || "";
}
var p = new Person("zhang");
alert(p.getName()); // zhang
var Student = function (name) {
    this.name = name;
    this.saying = "student saying";
}
Student.prototype = new Person();
Student.prototype.purr = function (n) {
    var i, s = '';
    for(i = 0; i < n; i++) {
        if(s) {
            s += "-";
        }
        s += "r";
    }
    return s;
}
var s = new Student("li");
alert(s.getSaying());   // sayistudent
alert(s.purr(10));  // r-r-r-r-r-r-r-r-r-r

偽類模式的本意是向面向?qū)ο罂繑n贺奠,但是看起來總是格格不入长踊,我們可以優(yōu)化一個

Function.prototype.method = function (name, func) {
    if (! this.prototype[name]) {
        this.prototype[name] = func;
    }
    return this;
}
Function.method("inherits", function (Parent) {
    this.prototype = new Parent();
    return this;
});
var Teacher = function (name) {
    this.name = name;
    this.saying = "teacher saying";
}
.inherits(Person)
.method("purr", function (n) {
    var i, s = '';
    for(i = 0; i < n; i++) {
        if(s) {
            s += "-";
        }
        s += "r";
    }
    return s;
})
.method("getName", function (){
    return this.getSaying() + " " + this.name + this.getSaying();   
});
var t = new Teacher("wang");
alert(t.getName()); // wang
alert(t.purr(3));       // r-r-r

缺陷
沒有私有環(huán)境
所有的屬性都是公開的
無法訪問super父類的方法
在實例化時试吁,如果忘記new,那么this會指向全局環(huán)境
2.對象說明符
有時候谒撼,實例化構(gòu)造器時會有許多參數(shù)食寡,我們會感覺很麻煩

var myObject = maker(f, l, s, c);

因此我們可以如下面來,使用對象說明符

var myObject = maker({
    first : f,
    last : l,
    state : s,
    city : c
});

這樣我們就可以很清晰的看清楚了參數(shù)的順序關(guān)系了
對象說明符和JSON結(jié)合使用有意想不到的便捷
3.原型
讓我們用對象字面量的形式創(chuàng)建一個有用的對象

var myPerson = {
    name : "hello everyone",
    getName : function() {
        return this.name;
    },
    says : function () {
        return this.saying || "";
    }
}
Object.prototype.create = function (o) {
    if(typeof Object.create !== "function") {
        Object.create = function () {
            var F = function () {};
            F.prototype = o;
            return new F();
        }
    }
}
var worker = Object.create(myPerson);
worker.name = "worker";
worker.saying = "saying";
worker.getSaying = function () {
    return this.name + " " + this.saying;
}
alert(worker.getSaying());  // worker saying
alert(myPerson.getName());      // hello everyone

4.函數(shù)化
迄今為止廓潜,我們所有的繼承的方式都無法保護隱私抵皱,我們可以用模式的方式來解決

var mammal = function (spec) {
    var that = {};
    that.getName = function () {
        return spec.name;
    };
    that.getSaying = function () {
        return spec.saying || "";
    }
    return that;
}
var m = mammal({name : "zhang"});
alert(m.name);  // undefined
alert(m.getName()); // zhang

讓cat繼承mammal

Function.prototype.method = function (name, func) {
    if(this.prototype[name] !== "function") {
        this.prototype[name] = func;
    }
    return this;
}
var cat = function(spec) {
    spec.saying = spec.saying || "";
    var that = mammal(spec);
    override getName method
    that.getName = function () {
        return spec.name + " : " + spec.saying;
    };
    that.purr = function (n) {
        var i, s = '';
        for(i = 0; i < n; i++) {
            if(s) {
                s += "-";
            }
            s += "r";
        }
        return s;
    }
    return that;
}
var c = cat({name : "wang", saying : "hello dear"});
alert(c.getName()); // wang : hello dear
alert(c.purr(3));       // r-r-r
// 調(diào)用父類的方法
Object.method("superior", function (name) {
    var that = this,
        method = that[name];
    return function () {
        return method.apply(that, arguments);
    }
});
var littleCat = function (spec) {
    var that = cat(spec);
    get_super_name = that.superior("getName");
    that.getName = function () {
        return "like " + get_super_name() + " body";
    }
    return that;
}
var lc = littleCat({name : "zhangFei", saying : "Come On"});
alert(lc.getName());    // like zhangFei : Come On body

5.部件

var eventuality = function (that) {
    var registry = {};
    that.fire = function (event) {
        // alert(event.type);       // show
        var array, func, handler, i,
            type = typeof event === "string" ? event : event.type;
        if(registry.hasOwnProperty(type)) {
            array = registry[type];
            // alert(array);    // [object Object]
            for(i = 0; i < array.length; i++) {
                handler = array[i];
                // alert(handler);  // [object Object]
                func = handler.method;
                // alert(func());   // show
                if (typeof func === 'string') {
                    func = this[func];
                }
                func.apply(this, handler.parameters || [event]);
            }
        }
        return this;
    }
    that.on = function (type, method, parameters) {
        var handler = {
            method : method, 
            parameters : parameters
        };
        // handler = {
            // method : "show",
            // parameters : [1, 2, 3]
        // }
        if(registry.hasOwnProperty(type)) {
            registry[type].push(handler);
        } else {
            registry[type] = [handler];
        }
        // alert(registry[type][0].method());       // show
        // alert(registry[type][0].parameters); // 1, 2, 3

        return this;
    }
    return that;
}
var e = eventuality({ name : "zhang"});
var show = function () {
    return "show";
}
e.on("show", show, [1, 2, 3]);
e.fire({type : "show"});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市辩蛋,隨后出現(xiàn)的幾起案子呻畸,更是在濱河造成了極大的恐慌,老刑警劉巖悼院,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伤为,死亡現(xiàn)場離奇詭異,居然都是意外死亡据途,警方通過查閱死者的電腦和手機绞愚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颖医,“玉大人位衩,你說我怎么就攤上這事”慵梗” “怎么了蚂四?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵光戈,是天一觀的道長。 經(jīng)常有香客問我遂赠,道長久妆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任跷睦,我火速辦了婚禮筷弦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抑诸。我一直安慰自己烂琴,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布蜕乡。 她就那樣靜靜地躺著奸绷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪层玲。 梳的紋絲不亂的頭發(fā)上号醉,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音辛块,去河邊找鬼畔派。 笑死,一個胖子當著我的面吹牛润绵,可吹牛的內(nèi)容都是我干的线椰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼尘盼,長吁一口氣:“原來是場噩夢啊……” “哼憨愉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起卿捎,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤莱衩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后娇澎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡睹晒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年趟庄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伪很。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡戚啥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锉试,到底是詐尸還是另有隱情猫十,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站拖云,受9級特大地震影響贷笛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宙项,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一乏苦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尤筐,春花似錦汇荐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至油昂,卻和暖如春革娄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秕狰。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工稠腊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸣哀。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓架忌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親我衬。 傳聞我的和親對象是個殘疾皇子叹放,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

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

  • 1.繼承(接口繼承和實現(xiàn)繼承) 繼承是 OO 語言中的一個最為人津津樂道的概念。許多 OO 語言都支持兩種繼承方式...
    believedream閱讀 950評論 0 3
  • 博客內(nèi)容:什么是面向?qū)ο鬄槭裁匆嫦驅(qū)ο竺嫦驅(qū)ο缶幊痰奶匦院驮瓌t理解對象屬性創(chuàng)建對象繼承 什么是面向?qū)ο?面向?qū)ο?..
    _Dot912閱讀 1,422評論 3 12
  • 本文先對es6發(fā)布之前javascript各種繼承實現(xiàn)方式進行深入的分析比較挠羔,然后再介紹es6中對類繼承的支持以及...
    lazydu閱讀 16,679評論 7 44
  • GIT(分布式版本控制系統(tǒng)) Git是一個開源的分布式版本控制系統(tǒng)破加,可以有效俱恶、高速的處理從很小到非常大的項目版本管...
    困卡閱讀 206評論 0 0
  • 在生命的陰影雨季 你從不被了解 只被分段 一瓣焰火 一半姹紫 一瓣薄來晚云 一瓣寒
    柒夜閱讀 195評論 0 1