this_原型鏈_繼承

this 相關(guān)問(wèn)題

1.apply、call 燃观、bind有什么作用叶组,什么區(qū)別

  • fn.apply(context , paramArray) , 第一個(gè)參數(shù)context被設(shè)置為this , 其他參數(shù)使用數(shù)組的形勢(shì)阶祭。
  • fn.call(context , param1 , param2) , 第一個(gè)參數(shù)context被設(shè)置為this , 其他參數(shù)使用列表的形勢(shì)。
  • obj.fn.bind(obj) , 返回一個(gè)新函數(shù)勒奇,并將參數(shù)設(shè)置為函數(shù)的this

2.以下代碼輸出什么?

var john = { 
  firstName: "John" 
}
function func() { 
  alert(this.firstName + ": hi!")
}
john.sayHi = func
john.sayHi()

這個(gè)代碼可以轉(zhuǎn)換成:

    var john = {
        firstName: "John",
        sayHi: func
    }
    function func() {
        alert(this.firstName + ": hi!")
    }
    john.sayHi()

所以調(diào)用john對(duì)象的sayHi屬性得到屬性值func , 然后由于func是個(gè)函數(shù)预鬓,后面加了一個(gè)() , 變成執(zhí)行func函數(shù)赊颠,得到結(jié)果為: john: hi!

3.下面代碼輸出什么格二,為什么

func() 
function func() { 
  alert(this)
}

我們也可以寫成這種形式:

    func.call(undefined)
    function func() {
        alert(this)
    }

所以它的this是window , 輸出window

4.下面代碼輸出什么

    document.addEventListener('click', function(e){
        console.log(this);       //document , 在事件中劈彪,this指向的是被監(jiān)聽的DOM源對(duì)象
        setTimeout(function(){
            console.log(this);   //setTimeout和setInterval的this都是window
        }, 200);
    }, false);

5.下面代碼輸出什么,why

var john = { 
  firstName: "John" 
}

function func() { 
  alert( this.firstName )
}
func.call(john)

使用call的形式調(diào)用func顶猜,john被設(shè)置為func的this沧奴,輸出this,firstName想當(dāng)于輸出john.firstName , 輸出結(jié)果為John。

6.以下代碼有什么問(wèn)題长窄,如何修改

var module= {
    bind: function(){
        var _this = this;
        $btn.on('click', function(){
            console.log(this)    //this指$btn這個(gè)源DOM
            _this.showMsg();     /*調(diào)用showMsg這個(gè)屬性滔吠,需要使用它的對(duì)象module,所以應(yīng)該將context設(shè)置為module,所以如果想使用this
                                    的話挠日,應(yīng)該在module的作用域內(nèi)將this賦予一個(gè)變量疮绷,然后調(diào)用這個(gè)變量就可以使用module作用域內(nèi)的this*/

        })
    },
    showMsg: function(){
        console.log('饑人谷');
    }
}

原型鏈相關(guān)問(wèn)題

7.有如下代碼,解釋Person嚣潜、 prototype冬骚、proto、p懂算、constructor之間的關(guān)聯(lián)只冻。

function Person(name){
    this.name = name;
}
Person.prototype.sayName = function(){
    console.log('My name is :' + this.name);
}
var p = new Person("若愚")
p.sayName();

Person函數(shù)聲明的時(shí)候,創(chuàng)造一個(gè)prototype對(duì)象犯犁,此時(shí)這個(gè)對(duì)象是空的属愤,后面給它添加了一個(gè)sayName方法女器,p是一個(gè)構(gòu)造函數(shù)酸役,通過(guò)new得來(lái),在查找sayName時(shí)驾胆,在p的prototype里面找不到涣澡,于是順著它的原型鏈往上找,p的proto指向Person的prototype中的方法sayName , 于是P就可以使用sayName的方法了丧诺。Person的prototype對(duì)象里面的constructor就是Person入桂。

8.上例中,對(duì)對(duì)象 p可以這樣調(diào)用 p.toString()驳阎。toString是哪里來(lái)的? 畫出原型圖?并解釋什么是原型鏈抗愁。

可以調(diào)用,toString是由p的proto屬性指向他更高級(jí)的類呵晚,得來(lái)的蜘腌,p是一個(gè)函數(shù),所以它的類可以是對(duì)象饵隙,所以p的proto找到了對(duì)象的prototype中的toString()方法撮珠,假設(shè)在對(duì)象的prototype當(dāng)中沒(méi)有找到toString,它還會(huì)往更高級(jí)的類上面去找金矛,直到找到為止芯急,如果最后還找不到勺届,就返回一個(gè)undefined,這樣一種依靠proto指向來(lái)尋找方法的這個(gè)過(guò)程娶耍,就像一條鎖鏈免姿,而由于是原型proto在這一過(guò)程當(dāng)中去尋找,所以形象的稱之為原型鏈榕酒。

原型鏈.png

9.對(duì)String做擴(kuò)展养泡,實(shí)現(xiàn)如下方式獲取字符串中頻率最高的字符

      function String(str){
        this.str = str;
    }
    String.prototype = {
        constructor: String,
        getMostOften: function () {
            var strArr = this.str.split('');
            var max = 0;
            var sum = 0;
            var letter = [];
            var repeatLetter = false;
            for(var i=0; i<strArr.length; i++){
                for(var j=0; j<strArr.length; j++){
                    if(strArr[i] === strArr[j]){
                        sum++;
                    }
                }
                if(sum > max){
                    max = sum;
                    letter = [];
                    letter.push(strArr[i]);
                }else if(sum === max){
                    for(var k=0; k<i; k++){
                        if(strArr[k] === strArr[i]){
                            repeatLetter = true;
                        }
                    }
                    if(!repeatLetter){
                        letter.push(strArr[i]);
                    }
                }
                sum = 0;
                repeatLetter = false;
            }
            return letter.join(',');
        }
    };

    var a = new String('11112222233333');
    var b = a.getMostOften();
    console.log(b);

10.instanceOf有什么作用??jī)?nèi)部邏輯是如何實(shí)現(xiàn)的奈应?

判斷一個(gè)對(duì)象是不是某個(gè)類型的實(shí)例澜掩,如 [1,2,3] instanceOf Array , 返回結(jié)果為boolean。
它的內(nèi)部邏輯是通過(guò)原型鏈的繼承機(jī)制來(lái)實(shí)現(xiàn)的杖挣,核心代碼如下:

function instanceOf(obj,func) {
        if(obj.__proto__ === func.prototype){
            return true;
        }else{
            return false;
        }
    }

繼承相關(guān)問(wèn)題

11.繼承有什么作用?

一個(gè)對(duì)象可以使用別的對(duì)象的屬性和方法就叫繼承肩榕。
通過(guò)繼承,我們可以避免寫出很多重復(fù)的代碼惩妇,節(jié)約內(nèi)存株汉。

12.下面兩種寫法有什么區(qū)別?

//方法1
function People(name, sex){
    this.name = name;
    this.sex = sex;
    this.printName = function(){
        console.log(this.name);
    }
}
var p1 = new People('饑人谷', 2)

//方法2
function Person(name, sex){
    this.name = name;
    this.sex = sex;
}

Person.prototype.printName = function(){
    console.log(this.name);
}
var p1 = new Person('若愚', 27);

方法1是添加屬性,方法2是添加方法歌殃。方法1創(chuàng)建一個(gè)構(gòu)造函數(shù)的時(shí)候乔妈,不管你是否使用printName它都會(huì)創(chuàng)造這個(gè)屬性。而方法2的printName是根據(jù)你自己的需要來(lái)決定的氓皱,你不使用這個(gè)方法它就不會(huì)在創(chuàng)建構(gòu)造函數(shù)的時(shí)候創(chuàng)建出來(lái)路召,方法2就起到了節(jié)省內(nèi)存的作用。

13.Object.create 有什么作用波材?兼容性如何股淡?

使用指定的原型對(duì)象及其屬性去創(chuàng)建一個(gè)新的對(duì)象。示例代碼如下:

    function person(name, age) {
        this.name = name;
        this.age = age;
    }
    person.prototype = {
        constructor: person,
        sayName: function () {
            console.log(this.name);
        }
    }
    function people(sex, professional) {
        this.sex = sex;
        this.professional = professional;
    }
    people.prototype = {
        constructor: people,
        saySex: function () {
            console.log(this.sex);
        }
    }
    //現(xiàn)在我指定person的原型對(duì)象和屬性為people.prototype
    person.prototype = Object.create(people.prototype);
    person.prototype.constructor = person;
    console.log(person.prototype);
Object.create()兼容性.png

14. hasOwnProperty有什么作用廷区? 如何使用唯灵?

判斷某個(gè)屬性是否是自身屬性而不是繼承得來(lái)的,如果是則返回true , 如果不是則返回false隙轻。
示例代碼如下:

function person(name, age) {
        this.name = name;
        this.age = age;
    }
    person.prototype = {
        constructor: person,
        sayName: function () {
            console.log(this.name);
        }
    }
    if(person.hasOwnProperty('toString')){
        console.log(1);
    }
    if(person.hasOwnProperty('name')){
        console.log(2);
    }
//輸出結(jié)果為2

15.如下代碼中call的作用是什么?

function Person(name, sex){
    this.name = name;
    this.sex = sex;
}
function Male(name, sex, age){
    Person.call(this, name, sex);    //這里的 call 有什么作用
    this.age = age;
}

這里的call將this變成Male , 而不是Person埠帕。從而使得Male可以繼承Person的屬性。

16.補(bǔ)全代碼玖绿,實(shí)現(xiàn)繼承

    function Person(name, sex){
        this.name = name;
        this.sex = sex;
    }

    Person.prototype.getName = function(){
        console.log(this.name);
    };

    function Male(name, sex, age){
        Person.call(this, name, sex);
        this.age = age;
    }
    Male.prototype = Object.create(Person.prototype);
    Male.prototype.constructor = Male;
    Male.prototype.getAge = function(){
        console.log(this.age)
    };

    var ruoyu = new Male('若愚', '男', 27);
    ruoyu.getName();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末敛瓷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子镰矿,更是在濱河造成了極大的恐慌琐驴,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異绝淡,居然都是意外死亡宙刘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門牢酵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)悬包,“玉大人,你說(shuō)我怎么就攤上這事馍乙〔冀” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵丝格,是天一觀的道長(zhǎng)撑瞧。 經(jīng)常有香客問(wèn)我,道長(zhǎng)显蝌,這世上最難降的妖魔是什么预伺? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮曼尊,結(jié)果婚禮上酬诀,老公的妹妹穿的比我還像新娘。我一直安慰自己骆撇,他們只是感情好瞒御,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著神郊,像睡著了一般肴裙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屿岂,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天践宴,我揣著相機(jī)與錄音鲸匿,去河邊找鬼爷怀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛带欢,可吹牛的內(nèi)容都是我干的运授。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼乔煞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吁朦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起渡贾,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤逗宜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纺讲,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡擂仍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了熬甚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逢渔。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖乡括,靈堂內(nèi)的尸體忽然破棺而出肃廓,到底是詐尸還是另有隱情,我是刑警寧澤诲泌,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布盲赊,位于F島的核電站,受9級(jí)特大地震影響敷扫,放射性物質(zhì)發(fā)生泄漏角钩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一呻澜、第九天 我趴在偏房一處隱蔽的房頂上張望递礼。 院中可真熱鬧,春花似錦羹幸、人聲如沸脊髓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)将硝。三九已至,卻和暖如春屏镊,著一層夾襖步出監(jiān)牢的瞬間依疼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工而芥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留律罢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓棍丐,卻偏偏與公主長(zhǎng)得像误辑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子歌逢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • 1. apply巾钉、call 、bind有什么作用秘案,什么區(qū)別砰苍? call ,apply的作用:調(diào)用一個(gè)函數(shù)潦匈,傳入函數(shù)...
    Rising_suns閱讀 395評(píng)論 0 0
  • this 相關(guān)問(wèn)題 問(wèn)題1: apply、call 有什么作用赚导,什么區(qū)別 Javascript的每個(gè)Functio...
    Maggie_77閱讀 595評(píng)論 0 0
  • 通過(guò)題目來(lái)熟悉this历等,原型鏈,繼承 開胃菜----this 1. apply辟癌、call寒屯、bind有什么作用,有什...
    JunVincetHuo閱讀 382評(píng)論 0 0
  • 1. this2.原型鏈-instanceof實(shí)現(xiàn)3.繼承的實(shí)現(xiàn) ** this 相關(guān)問(wèn)題 ** ** 1厂置、 ap...
    饑人谷_阿靖閱讀 353評(píng)論 0 0
  • apply菩掏、call 、bind有什么作用昵济,什么區(qū)別 apply:fn.apply( obj智绸,])將fn函數(shù)里的t...
    邵志遠(yuǎn)閱讀 494評(píng)論 0 0