国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js繼承實(shí)現(xiàn)之Object.create

Joonas / 2519人閱讀

摘要:是對(duì)象的一個(gè)實(shí)例,并且的。可以自己定義它的屬性,可寫可配可枚舉,均可自己定義,實(shí)現(xiàn)一條龍自助服務(wù)。這種方式比較適合父類為同級(jí)別,子類只要擁有相同的屬性和方法即可的情況。如有異議處,歡迎大家指出來(lái),一起探討。

同事前幾天去面試,回來(lái)同步了一下面試題庫(kù),其中一道題就是”new和Object.create的區(qū)別”。聽(tīng)到這個(gè)題目,我的第一個(gè)反映是 , what?( ???°_°??? ), Object.create這個(gè)東東我沒(méi)有用過(guò),怎么回答。為了避免無(wú)法給出response的尷尬,老夫抓緊一切時(shí)間開始在console里演示著。

-> demo <-

function Person(name, sex) {
   this.name = name;
   this.sex = sex;
}
Person.prototype.getInfo = function() {
   console.log("getInfo: [name:" + this.name + ", sex:" + this.sex + "]");
}
var a = new Person("jojo", "femal");
var b = Object.create(Person.prototype);

-> 分析 <-

赤裸裸的結(jié)果,a就是對(duì)象Person的實(shí)例,a.__proto__ === Person.prototype。what about b ? b是對(duì)象F的一個(gè)實(shí)例,并且b.__proto__ === Person.prototype的。

這個(gè)F到底是個(gè)啥呢? 好了,又到了copy-paste時(shí)間了,參考了https://developer.mozilla.org... 其實(shí)現(xiàn)的polyfill方法:

if (typeof Object.create !== "function") {
    //此方法未考慮create的第二個(gè)參數(shù)的實(shí)現(xiàn)
    Object.create = function (proto, propertiesObject) {
        if (typeof proto !== "object" && typeof proto !== "function") {
            throw new TypeError("Object prototype may only be an Object: " + proto);
        } else if (proto === null) {
            throw new Error("This browser"s implementation of Object.create is a shim and doesn"t support "null" as the first argument.");
        }

        if (typeof propertiesObject != "undefined") throw new Error("This browser"s implementation of Object.create is a shim and doesn"t support a second argument.");
        //實(shí)現(xiàn)一個(gè)隱藏函數(shù)
        function F() {}
        //函數(shù)的原型設(shè)置為參數(shù)傳進(jìn)來(lái)的原型
        F.prototype = proto;
        // 返回一個(gè)F函數(shù)的實(shí)例,即此實(shí)例的__proto__指向?yàn)閰?shù)proto
        return new F();
    };
}

好吧,既然都看了polyfill了,就知道Object.create到底是干啥的了,它就是生成了一個(gè)實(shí)例,這個(gè)實(shí)例的原型由我來(lái)指定,但是它的構(gòu)造函數(shù)F被隱藏了。那下面我們來(lái)驗(yàn)證一下是不是這個(gè)邏輯。

通過(guò)Object.create()生成的實(shí)例怎么才能有自己的屬性呢,別怕,我們看一下它完成的面目是怎樣的,撒花,揭幕~~Object.create(proto, [propertiesObject]), 人家是有第二個(gè)參數(shù)滴。可以自己定義它的屬性,可寫、可配、可枚舉,均可自己定義,實(shí)現(xiàn)一條龍自助服務(wù)。

var b = Object.create(Person.prototype, {
    name: {
        value: "coco",
        writable: true,
        configurable: true,
        enumerable: true,
    },
    sex: {
        enumerable: true,
        get: function(){ return "hello sex"},
        set: function(val){console.log("set value:" + val)}
    }
})

-> 更進(jìn)一步 <-

說(shuō)了這么多,那Object.create的應(yīng)用價(jià)值到底是什么呢? 看一下本文標(biāo)題就知道了,當(dāng)然說(shuō)的是繼承了,操刀試一下。

function Student(name, sex, age) {
    Person.call(this, name, sex);
    this.age = age;
}
//原型鏈拼接
Student.prototype = Object.create(Person.prototype);
//構(gòu)造函數(shù)彎了,糾正
Student.prototype.constructor = Student;
Student.prototype.getInfo = function() {
    console.log("getInfo: [name:" + this.name + ", sex:" + this.sex + ", age:" +this.age + "].");
}
    
var s = new Student("coco", "femal", 25);

s是Student的實(shí)例,Person.prototype在s的原型鏈上,并且這個(gè)F實(shí)例的constructor又指回了Student。
既然說(shuō)到了這里,那如果想要一個(gè)對(duì)象繼承多個(gè)類怎么辦呢?在上面的代碼基礎(chǔ)上使用mixin加工下就可啦。

//再創(chuàng)建一個(gè)基類
function Animal(age) {
 this.age = age;
}
Animal.prototype.say = function(language) { 
    console.log("you say " + language);
}

function Student(name, sex, age) {
    Person.call(this, name, sex);
    Animal.call(this, age);
}
//原型鏈拼接
Student.prototype = Object.create(Person.prototype);
Object.assign(Student.prototype, Animal.prototype);
Student.prototype.constructor = Student;
Student.prototype.getInfo = function() {
    console.log("getInfo: [name:" + this.name + ", sex:" + this.sex + ", age:" +this.age + "].");
};
var s = new Student("coco", "femal", 25);

s的原型仍是一個(gè)F實(shí)例,其原型指向了Person,但是這個(gè)F實(shí)例上mixin了Animal的方法。但是原型鏈上并沒(méi)有Animal什么事,通過(guò)instanceof可以驗(yàn)證這一點(diǎn)。這種方式比較適合父類為同級(jí)別,子類只要擁有相同的屬性和方法即可的情況。

如有異議處,歡迎大家指出來(lái),一起探討。學(xué)習(xí)費(fèi)腦掉了好多頭皮屑,不過(guò)今天又可以碎個(gè)覺(jué)了。

∧__∧
( ●ω●)
|つ/(___
/└-(____(dá)/bug>>>bug>>bug>bug
 ̄ ̄ ̄ ̄ ̄ ̄

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/94589.html

相關(guān)文章

  • JS面向?qū)ο蟮某绦蛟O(shè)計(jì)繼承實(shí)現(xiàn)-原型式繼承和寄生式繼承

    摘要:通過(guò)新增方法規(guī)范了原型式繼承。適用場(chǎng)景在沒(méi)有必要興師動(dòng)眾地創(chuàng)建構(gòu)造函數(shù),而只想讓一個(gè)對(duì)象與另外一個(gè)對(duì)象保持類似的情況下,原型式繼承是完全可以勝任的。在主要考慮對(duì)象而不是自定義類型和構(gòu)造函數(shù)的情況下,寄生式繼承也是一種有用的模式。 --前言:最近在細(xì)讀Javascript高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下。如有紕漏或錯(cuò)誤,會(huì)非常感...

    lewinlee 評(píng)論0 收藏0
  • 深入理解 js 繼承與原型鏈

    摘要:原型鏈與繼承當(dāng)談到繼承時(shí),只有一種結(jié)構(gòu)對(duì)象。如果對(duì)該圖不怎么理解,不要著急,繼續(xù)往下看基于原型鏈的繼承對(duì)象是動(dòng)態(tài)的屬性包指其自己的屬性。當(dāng)使用操作符來(lái)作用這個(gè)函數(shù)時(shí),它就可以被稱為構(gòu)造方法構(gòu)造函數(shù)。 原型鏈與繼承 當(dāng)談到繼承時(shí),JavaScript 只有一種結(jié)構(gòu):對(duì)象。每個(gè)實(shí)例對(duì)象(object )都有一個(gè)私有屬性(稱之為proto)指向它的原型對(duì)象(prototype)。該原型對(duì)象也...

    xingqiba 評(píng)論0 收藏0
  • 揭秘babel的魔法class繼承的處理2

    摘要:并且用驗(yàn)證了中一系列的實(shí)質(zhì)就是魔法糖的本質(zhì)。抽絲剝繭我們首先看的編譯結(jié)果這是一個(gè)自執(zhí)行函數(shù),它接受一個(gè)參數(shù)就是他要繼承的父類,返回一個(gè)構(gòu)造函數(shù)。 如果你已經(jīng)看過(guò)第一篇揭秘babel的魔法之class魔法處理,這篇將會(huì)是一個(gè)延伸;如果你還沒(méi)看過(guò),并且也不想現(xiàn)在就去讀一下,單獨(dú)看這篇也沒(méi)有關(guān)系,并不存在理解上的障礙。 上一篇針對(duì)Babel對(duì)ES6里面基礎(chǔ)class的編譯進(jìn)行了分析。這一篇將...

    BlackHole1 評(píng)論0 收藏0
  • JavaScript深入各種繼承

    摘要:通常有這兩種繼承方式接口繼承和實(shí)現(xiàn)繼承。理解繼承的工作是通過(guò)調(diào)用函數(shù)實(shí)現(xiàn)的,所以是寄生,將繼承工作寄托給別人做,自己只是做增強(qiáng)工作。適用基于某個(gè)對(duì)象或某些信息來(lái)創(chuàng)建對(duì)象,而不考慮自定義類型和構(gòu)造函數(shù)。 一、繼承的概念 繼承,是面向?qū)ο笳Z(yǔ)言的一個(gè)重要概念。通常有這兩種繼承方式:接口繼承和實(shí)現(xiàn)繼承。接口繼承只繼承方法簽名,而實(shí)現(xiàn)繼承則繼承實(shí)際的方法。 《JS高程》里提到:由于函數(shù)沒(méi)有簽名,...

    tomlingtm 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<