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

資訊專欄INFORMATION COLUMN

一道有價(jià)值的JS繼承面試題

darkbug / 1035人閱讀

摘要:題目原題目來源于一個(gè)網(wǎng)友的問答補(bǔ)充代碼我有個(gè)我有個(gè)分析題目希望生成一個(gè)新的構(gòu)造函數(shù),繼承于。盡量不要更改題目表達(dá)出希望有方法實(shí)現(xiàn)構(gòu)造函數(shù)繼承,又需要原型繼承。的指向顯然要改成指向子類構(gòu)造函數(shù)中的。

題目

原題目來源于一個(gè)網(wǎng)友的問答

var A = function() {
    this.name = "apple";
}
A.prototype.getName = function() {
    return this.name;
}

// 補(bǔ)充代碼

var B = A.extend({
    initialize: function() {
        this.superclass.initialize.call(this);
        this.total = 3;
    },
    say: function() {
        return "我有" + this.total + "個(gè)" + this.getName()
    }
});
var b = new B();
console.log(b.say()); //我有3個(gè)apple

分析

題目希望生成一個(gè)新的構(gòu)造函數(shù),B繼承于A。(盡量不要更改A)

題目表達(dá)出希望有initialize方法實(shí)現(xiàn)構(gòu)造函數(shù)繼承,又需要原型繼承。不難想到我們要用組合繼承、寄生組合繼承或者ES6繼承。

如果所有的函數(shù)都可以使用extend方法生成一個(gè)新的構(gòu)造函數(shù),那方法的通用性會(huì)更強(qiáng)。

initialize的this指向顯然要改成指向子類構(gòu)造函數(shù)中的this。

解答
一. 要實(shí)現(xiàn)分析的第三點(diǎn),不難想到使用函數(shù)的原型

Function.prototype.extend= Function.prototype.extend || function(obj) {}

二. initialize方法實(shí)現(xiàn)構(gòu)造函數(shù)繼承

Function.prototype.extend= Function.prototype.extend || function(obj) {
    var self = this; //這里的this指向函數(shù)調(diào)用者,也可以是A

    function SubClass() {
        this.superclass = { initialize: self };
        if (obj.initialize) {
            obj.initialize.call(this); //處理this指向問題
        }
    }
    
    return SubClass;
}

三. 原型繼承并且添加新的原型方法

Function.prototype.extend= Function.prototype.extend || function(obj) {
    var self = this; //這里的this指向函數(shù)調(diào)用者,也可以是A

    function SubClass() {
        this.superclass = { initialize: self };
        if (obj.initialize) {
            obj.initialize.call(this); //處理this指向問題
        }
    }
    
    SubClass.prototype = new self();
    SubClass.prototype.constructor = SubClass;

    for(var key in obj){
        if(key !== "initialize"){
            SubClass.prototype[key] = obj[key]
        }
    }
    
    return SubClass;
}

問題

添加較為嚴(yán)謹(jǐn)?shù)念愋团袛?/p>

組合繼承是存在一定問題的(見javascript高級教程第六章),如果能用ES6繼承會(huì)更好。

改進(jìn)

function inherits(subClass, superClass) { // ES6繼承
    if (typeof superClass !== "function" && superClass !== null) {
        throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
    }
    subClass.prototype = Object.create(superClass && superClass.prototype, {
        constructor: { 
            value: subClass,
            enumerable: false,
            writable: true,
            configurable: true
        }
    });
    if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
}

function getType(obj) {
    return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
}

Function.prototype.extend= Function.prototype.extend || function(obj) {
    var self = this; //這里的this指向函數(shù)調(diào)用者,也可以是A

    function SubClass() {
        this.superclass = { initialize: self };
        if (getType(obj) === "object" && getType(obj.initialize) === "function") {
            obj.initialize.call(this); //處理this指向問題
        }
    }
    
    inherits(SubClass, self);

    for (var key in obj) {
        if (key !== "initialize") {
            SubClass.prototype[key] = obj[key]
        }
    }
    
    return SubClass;
}

總結(jié):

該題目考查了幾個(gè)重要的知識點(diǎn):原型,繼承,閉包,this指向。是一道比較值得去好好思考的題目。

希望有更好的解決方案出現(xiàn)。

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/82269.html

相關(guān)文章

  • 一道簡單js繼承面試來查考你是否真透徹了解繼承

    摘要:但這兩個(gè)對象的原型指向了同一個(gè)實(shí)例對象,這個(gè)實(shí)例對象同樣是存在棧內(nèi)存中的然后指向了一個(gè)對象。實(shí)際是在的實(shí)例對象增加一個(gè)屬性,并將屬性賦值為,但它并沒有修改原型鏈上的屬性。側(cè)重理解的指向問題 直接先貼題目吧 function A() { this.name = a this.color = [green, yellow] } function B() { ...

    jcc 評論0 收藏0
  • 2017 前端面試準(zhǔn)備 - 收藏集 - 掘金

    摘要:最近遇到的前端面試題更新版前端掘金個(gè)人博客已上線,歡迎前去訪問評論無媛無故的個(gè)人博客以下內(nèi)容非本人原創(chuàng),是整理后覺得更容易理解的版本,歡迎補(bǔ)充。 一道面試題引發(fā)的對 javascript 類型轉(zhuǎn)換的思考 - 前端 - 掘金 最近群里有人發(fā)了下面這題:實(shí)現(xiàn)一個(gè)函數(shù),運(yùn)算結(jié)果可以滿足如下預(yù)期結(jié)果: ... 收集 JavaScript 各種疑難雜癥的問題集錦 - 前端 - 掘金 從原博客遷移...

    王晗 評論0 收藏0
  • 2017 前端面試準(zhǔn)備 - 收藏集 - 掘金

    摘要:最近遇到的前端面試題更新版前端掘金個(gè)人博客已上線,歡迎前去訪問評論無媛無故的個(gè)人博客以下內(nèi)容非本人原創(chuàng),是整理后覺得更容易理解的版本,歡迎補(bǔ)充。 一道面試題引發(fā)的對 javascript 類型轉(zhuǎn)換的思考 - 前端 - 掘金 最近群里有人發(fā)了下面這題:實(shí)現(xiàn)一個(gè)函數(shù),運(yùn)算結(jié)果可以滿足如下預(yù)期結(jié)果: ... 收集 JavaScript 各種疑難雜癥的問題集錦 - 前端 - 掘金 從原博客遷移...

    xiaochao 評論0 收藏0
  • 2017 前端面試準(zhǔn)備 - 收藏集 - 掘金

    摘要:最近遇到的前端面試題更新版前端掘金個(gè)人博客已上線,歡迎前去訪問評論無媛無故的個(gè)人博客以下內(nèi)容非本人原創(chuàng),是整理后覺得更容易理解的版本,歡迎補(bǔ)充。 一道面試題引發(fā)的對 javascript 類型轉(zhuǎn)換的思考 - 前端 - 掘金最近群里有人發(fā)了下面這題:實(shí)現(xiàn)一個(gè)函數(shù),運(yùn)算結(jié)果可以滿足如下預(yù)期結(jié)果: ... 收集 JavaScript 各種疑難雜癥的問題集錦 - 前端 - 掘金從原博客遷移過來...

    KitorinZero 評論0 收藏0
  • 一道面試引發(fā)思考

    摘要:下面我們來使用面向?qū)ο箢悎D這里就不再畫了首先面試題中所提到的我們都可以看成類,比如停車場是一個(gè)類吧,它里面的車位是一個(gè)類吧,攝像頭,屏幕。。。 以下是某場的一道面試題(大概): 1、一個(gè)停車場,車輛入場時(shí),攝像頭記錄下車輛信息2、屏幕上顯示所接收的車輛的信息情況(車牌號)以及各層車位的車位余量3、停車場一共四層車位,其中的三層都為普通車位,還有一層為特殊車位(體現(xiàn)在停車計(jì)費(fèi)價(jià)格上面的不...

    Apollo 評論0 收藏0

發(fā)表評論

0條評論

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