高級2

問題1: apply送朱、call 、bind有什么作用干旁,什么區(qū)別.

        var value = 100;
        var obj4 = {
            value: 200
        }
        function fn4(a, b) {
            console.log(this.value + a + b);
        }
        fn4(3,4);  // 107
        fn4.call(obj4, 3, 4) // 207
        var f = fn4.bind(obj4); // this指代obj4里的this
        f(3,4);   // 207
        fn4.apply(obj4, [3,4]) // 207

Function.prototype.bind
bind驶沼,返回一個新函數(shù),并且使函數(shù)內(nèi)部的this為傳入的第一個參數(shù)争群。

使用call和apply設置this
fn.call(obj, param1,param2)
fn.apply(obj, paramArray);
第一個參數(shù)都是希望設置的this對象回怜,不同之處在于call方法接受參數(shù)列表,而apply接受參數(shù)數(shù)組。
問題2: 以下代碼輸出什么?

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

相當于

var john = {
    firstName: "John"
    sayHi: function() {
        alert(this.firstName + ": hi!")
    }
}
john.sayHi()   // 這里是john對象調(diào)用,那么this指代john對象

問題3: 下面代碼輸出什么玉雾,為什么

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

輸出 window
在函數(shù)被直接調(diào)用時this綁定到全局對象翔试。在瀏覽器中,window就是該全局對象
問題4:下面代碼輸出什么

document.addEventListener('click', function(e){
    console.log(this);  // #document  // 指代綁定事件的對象即document
    setTimeout(function(){
        console.log(this);   // window // 定時器里執(zhí)行函數(shù)中的this指代全局對象
    }, 200);
}, false);

問題5:下面代碼輸出什么复旬,why

var john = { 
  firstName: "John" 
}

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

因為調(diào)用call方法,那么this指代的就是傳入的對象垦缅。
問題6: 以下代碼有什么問題,如何修改

var module= {
  bind: function(){
    $btn.on('click', function(){
      console.log(this) //this指什么
      this.showMsg();
    })
  },
  
  showMsg: function(){
    console.log('饑人谷');
  }
}

問題 this指代的是$btn 而不是module了驹碍,因此調(diào)用showMsg方法壁涎,這樣是錯誤的.
修改

var module= {
  bind: function(){
    $btn.on('click', function(){
      console.log(this) //this指什么
      this.showMsg();
    }.bind(this))
  },
  
  showMsg: function(){
    console.log('饑人谷');
  }
}

原型鏈相關問題
問題7:有如下代碼,解釋Person志秃、 prototype怔球、proto、p浮还、constructor之間的關聯(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();

當new一個函數(shù)的時候,首先會創(chuàng)建一個新對象p钧舌,其次會
執(zhí)行這個函數(shù)担汤,同時,函數(shù)里面的this就會指向這個新創(chuàng)建的對象延刘,如果
對this進行賦值或者進行操作那么就是對這個對象進行賦值漫试,操作六敬。
當函數(shù)執(zhí)行完之后碘赖,會把剛剛創(chuàng)建的對象給return出來。
把對象的proto指向了函數(shù)的prototype屬性外构。
p1.proto.constructor === Person
Person.prototype.constructor === Person
p1.constructor === Person; // 它自己沒有就會去原型里面找
問題8: 上例中普泡,對對象 p可以這樣調(diào)用 p.toString()。toString是哪里來的? 畫出原型圖?并解釋什么是原型鏈审编。

toString.png

原型圖.png

因為任何類的prototype屬性本質(zhì)上都是個類Object的實列撼班,所以prototype也和其他實列一樣也有個proto內(nèi)部屬性,指向其類型Object的prototype垒酬。自己類型的prototype找不到的話砰嘁,還會找prototype的類型的prototype屬性。
下面再看這個列子,如圖
p1下面沒有toString()勘究,那么向它的原型上找矮湘,即p1.proto ==== Person.prototype.
我們發(fā)現(xiàn)Person下也沒有toString().再向它的原型上找 即Person.prototype.proto === Object.prototype
這個時候我們發(fā)現(xiàn)Object的prototype屬性里有toString().
這就是原型鏈,如果還有找到的話口糕,那么就返回undefined缅阳。
問題9:對String做擴展,實現(xiàn)如下方式獲取字符串中頻率最高的字符

var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch); //d , 因為d 出現(xiàn)了5次
// 針對全是小寫字母的情況
String.prototype.getMostOften = function() {
            var arr = [];
            var letterCount = 'z'.charCodeAt() - 'a'.charCodeAt();
            for(var i = 0; i < letterCount; i++) {
                arr[i] = 0;
            }
            for(var i = 0; i < this.length; i++) {
                arr[this[i].charCodeAt()-'a'.charCodeAt()]++;
            }
            return Math.max.apply(null, arr);
        }

            var ch = str.getMostOften();

            console.log(ch);   // 5

問題10: instanceOf有什么作用景描?內(nèi)部邏輯是如何實現(xiàn)的十办?

判斷一個對象是不是某個類型的實列秀撇。

舉列說明

[1,2,3] instanceof Array

[1,2,3] instanceof Object

[1,2,3].__proto__ === Array.prototype   // ture

[1,2,3].__proto__.___proto__ === Object.prototype // true

a instanceof b
只要判斷a的原型是否等于b的prototype屬性。如果不相等向族,繼續(xù)判斷a的原型的原型是否等于
b的prototype屬性呵燕,如果不相等,那么就繼續(xù)找件相,直到虏等,找到最后,沒有找到能相等的适肠,那么就返回false
繼承相關問題
問題11:繼承有什么作用?
1霍衫、得到一個類的屬性
2、得到一個類的方法
問題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每次創(chuàng)建一個對像都會創(chuàng)建printName函數(shù)侯养。而printName方法實際上作用的相同的敦跌,會浪費大量的內(nèi)存
方法2 printName函數(shù)是共用的,這樣避免了重復
問題13: Object.create 有什么作用逛揩?兼容性如何柠傍?
舉列說明

var b = {};
a = Object.create(b);
a.__proto__ === b; // true;  即a的原型為b

es5


兼容性.png

問題14: hasOwnProperty有什么作用? 如何使用辩稽?
hasOwnPersonty是Object.prototype的一個方法,可以判斷一個對象是否包含自定義屬性而不是
原型鏈上的惧笛。
舉列說明

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

        Person.prototype = {
            sayName: function() {
                console.log("My name is " + this.name);
            },

            walk: function() {
                console.log(this.name + ' is walking');
            }
        }
        var p1 = new Person('tangyue', '20');
        p1.hasOwnProperty('name') // ture
        p1.hasOwnProperty('sayName') // false

問題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;
}

作用: 將Person方法內(nèi)部的this指向Male創(chuàng)建的實列對象。

問題16: 補全代碼逞泄,實現(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);
}
Male.prototype = Object.create(Person.prototype);
Male.prototype.getAge = function(){
   console.log(this.age);
};

var ruoyu = new Male('若愚', '男', 27);
ruoyu.getName();    // 若愚
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末患整,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子喷众,更是在濱河造成了極大的恐慌各谚,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件到千,死亡現(xiàn)場離奇詭異昌渤,居然都是意外死亡,警方通過查閱死者的電腦和手機憔四,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門膀息,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人了赵,你說我怎么就攤上這事潜支。” “怎么了斟览?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵毁腿,是天一觀的道長。 經(jīng)常有香客問我,道長已烤,這世上最難降的妖魔是什么鸠窗? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮胯究,結(jié)果婚禮上稍计,老公的妹妹穿的比我還像新娘。我一直安慰自己裕循,他們只是感情好臣嚣,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剥哑,像睡著了一般硅则。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上株婴,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天怎虫,我揣著相機與錄音,去河邊找鬼困介。 笑死大审,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的座哩。 我是一名探鬼主播徒扶,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼根穷!你這毒婦竟也來了姜骡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤缠诅,失蹤者是張志新(化名)和其女友劉穎溶浴,沒想到半個月后乍迄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體管引,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年闯两,在試婚紗的時候發(fā)現(xiàn)自己被綠了褥伴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡漾狼,死狀恐怖重慢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逊躁,我是刑警寧澤似踱,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響核芽,放射性物質(zhì)發(fā)生泄漏囚戚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一轧简、第九天 我趴在偏房一處隱蔽的房頂上張望驰坊。 院中可真熱鬧,春花似錦哮独、人聲如沸拳芙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舟扎。三九已至,卻和暖如春悴务,著一層夾襖步出監(jiān)牢的瞬間浆竭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工惨寿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留邦泄,地道東北人。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓裂垦,卻偏偏與公主長得像顺囊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蕉拢,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

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