this_原型鏈_繼承

this

問(wèn)題1: apply贯溅、call 、bind有什么作用,什么區(qū)別

  • call 和 apply 都是為了改變某個(gè)函數(shù)運(yùn)行時(shí)的上下(context)而存在的驮捍,換句話說(shuō),就是為了改變函數(shù)體內(nèi)部 this 的指向
    第一個(gè)參數(shù)都是希望設(shè)置的this對(duì)象脚曾,不同之處在于call方法接收參數(shù)列表东且,而apply接收參數(shù)數(shù)組
    func.call(this, arg1, arg2); func.apply(this, [arg1, arg2])

  • bind
    bind()方法會(huì)創(chuàng)建一個(gè)新函數(shù),稱為綁定函數(shù)斟珊,當(dāng)調(diào)用這個(gè)綁定函數(shù)時(shí)苇倡,綁定函數(shù)會(huì)以創(chuàng)建它時(shí)傳入 bind()方法的第一個(gè)參數(shù)作為 this,傳入 bind() 方法的第二個(gè)以及以后的參數(shù)加上綁定函數(shù)運(yùn)行時(shí)本身的參數(shù)按照順序作為原函數(shù)的參數(shù)來(lái)調(diào)用原函數(shù)

var foo = {
    bar : 1,
    eventBind: function(){
        var _this = this;
        $('.someClass').on('click',function(event) {
            /* Act on the event */
            console.log(_this.bar);     //1
        });
    }
}

區(qū)別是:當(dāng)你希望改變上下文環(huán)境之后并非立即執(zhí)行囤踩,而是回調(diào)執(zhí)行的時(shí)候旨椒,使用 bind() 方法。而 apply/call 則會(huì)立即執(zhí)行函數(shù)堵漱。

總結(jié)一下:
apply 综慎、 call 、bind 三者都是用來(lái)改變函數(shù)的this對(duì)象的指向的勤庐;
apply 示惊、 call 好港、bind 三者第一個(gè)參數(shù)都是this要指向的對(duì)象,也就是想指定的上下文米罚;
apply 钧汹、 call 、bind 三者都可以利用后續(xù)參數(shù)傳參录择;
bind 是返回對(duì)應(yīng)函數(shù)拔莱,便于稍后調(diào)用;apply 隘竭、call 則是立即調(diào)用 塘秦。
參考

問(wèn)題2: 以下代碼輸出什么?

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

問(wèn)題3: 下面代碼輸出什么,為什么

func() 
function func() { 
  alert(this)//輸出 [object window],因?yàn)樵诤瘮?shù)被直接調(diào)用時(shí)this綁定到全局對(duì)象,在瀏覽器中动看,window 就是該全局對(duì)象
}

問(wèn)題4:下面代碼輸出什么

document.addEventListener('click', function(e){
    console.log(this);//document
    setTimeout(function(){
        console.log(this);//window:setTimeout里的this指向window
    }, 200);
}, false);

問(wèn)題5:下面代碼輸出什么,為什么

var john = { 
  firstName: "John" 
}

function func() { 
  alert( this.firstName )
}
func.call(john)//John因?yàn)閒unc.call(john)的this就是第一個(gè)參數(shù)john

問(wèn)題6: 以下代碼有什么問(wèn)題尊剔,如何修改

var module= {
  bind: function(){
    $btn.on('click', function(){
      console.log(this) //this指$btn
      this.showMsg();
    })
  },
   
  showMsg: function(){
    console.log('hunger');
  }
}
問(wèn)題
//在事件處理程序中this代表事件源DOM對(duì)象,所以該處的this指向$btn
//this.showMsg() 同理這里的this指向$btn,所以這里會(huì)出錯(cuò)菱皆,因?yàn)?btn中沒(méi)有showMsg()方法應(yīng)該為如下
修改后:
var module= {
  bind: function(){
    var that = this;//引用this
    $btn.on('click', function(){
      console.log(that) 
      that.showMsg();//this為module
    })
  },
  showMsg: function(){
    console.log('hunger');
  }
}

原型鏈相關(guān)問(wè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();

通過(guò)函數(shù)定義類Person历造,類自動(dòng)獲得屬性prototype,p是Person類的實(shí)例船庇,有一個(gè)內(nèi)部屬性_proto_,
他指向類的prototype吭产,p._proto_.constructor指向構(gòu)造函數(shù)Person。

8.上例中

1.對(duì)象 p可以這樣調(diào)用p.toString(),toString是哪里來(lái)

image.png

2.畫(huà)出原型圖

image.png

3.解釋原型鏈

首先來(lái)說(shuō)說(shuō)prototype屬性:不像每個(gè)對(duì)象都有proto屬性來(lái)標(biāo)識(shí)自己所繼承的原型鸭轮,只有函數(shù)才有prototype屬性臣淤。
JS不像其它面向?qū)ο蟮恼Z(yǔ)言,它沒(méi)有類(class窃爷,ES6引進(jìn)了這個(gè)關(guān)鍵字)的概念邑蒋。JS通過(guò)函數(shù)來(lái)模擬類。
當(dāng)你創(chuàng)建函數(shù)時(shí)按厘,JS會(huì)為這個(gè)函數(shù)自動(dòng)添加prototype屬性医吊,值是空對(duì)象。而一旦你把這個(gè)函數(shù)當(dāng)作構(gòu)造函數(shù)(constructor)調(diào)用(即通過(guò)new關(guān)鍵字調(diào)用)逮京,那么JS就會(huì)幫你創(chuàng)建該構(gòu)造函數(shù)的實(shí)例卿堂,實(shí)例繼承構(gòu)造函數(shù)prototype的所有屬性和方法(實(shí)例通過(guò)設(shè)置自己的proto指向承構(gòu)造函數(shù)的prototype來(lái)實(shí)現(xiàn)這種繼承)。

JS正是通過(guò)proto和prototype的合作實(shí)現(xiàn)了原型鏈,以及對(duì)象的繼承草描。

構(gòu)造函數(shù)览绿,通過(guò)prototype來(lái)存儲(chǔ)要共享的屬性和方法,也可以設(shè)置prototype指向現(xiàn)存的對(duì)象來(lái)繼承該對(duì)象穗慕。

對(duì)象的proto指向自己構(gòu)造函數(shù)的prototype饿敲。obj.proto.proto...的原型鏈由此產(chǎn)生
two = new Object()中Object是構(gòu)造函數(shù),所以two.proto就是Object.prototype逛绵。ES規(guī)范定義對(duì)象字面量的原型就是Object.prototype诀蓉。

當(dāng)訪問(wèn)一個(gè)對(duì)象的某個(gè)屬性時(shí),會(huì)先在這個(gè)對(duì)象本身屬性上查找暑脆,如果沒(méi)有找到,則會(huì)去它的proto隱式原型上查找狐肢,即它的構(gòu)造函數(shù)的prototype添吗,如果還沒(méi)有找到就會(huì)再在構(gòu)造函數(shù)的prototype的proto中查找,這樣一層一層向上查找就會(huì)形成一個(gè)鏈?zhǔn)浇Y(jié)構(gòu)份名,我們稱為原型鏈碟联。

我們知道JS是單繼承的,Object.prototype是原型鏈的頂端僵腺,所有對(duì)象從它繼承了包括toString等等方法和屬性鲤孵。

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

法1:遍歷
String.prototype.getMostOften = function(){
            var arr = [];
            for(var i=0;i<this.length;i++){
                if(arr[this[i]]){
                    ++arr[this[i]];
                }else{
                    arr[this[i]] = 1;//必須在這里賦值為1
                }
            }

            var count = 0;
            var maxKey;
            for(var key in arr){
                if(arr[key]>count){
                    count = arr[key];//數(shù)字
                    maxKey = key;//a,b..
                }
            }
            var maxCount = count;
            return maxKey+':因?yàn)?+maxKey+'  出現(xiàn)了'+maxCount+'次';

        }
  var str = 'ahbbccdeddddfg';
  var ch = str.getMostOften();
  console.log(ch); //d , 因?yàn)閐 出現(xiàn)了5次
檢查元素__console.log
法2:正則
 String.prototype.getMostOften= function(str){
        return str.split('').sort().join('').match(/(\S)\1*/g).sort(function(a,b){
            return b.length - a.length;
        })[0][0];
};
    var str = 'ahbbccdeddddfg';
    var ch = str.getMostOften(str);
    var length = str.split('').sort().join('').match(/(\S)\1*/g).sort(function(a,b){
            return b.length - a.length;
        })[0].length;
    console.log(ch+':因?yàn)?+ch+'出現(xiàn)了'+length+'次'); //d , 因?yàn)閐 出現(xiàn)了5次

sort() 方法用于對(duì)數(shù)組的元素進(jìn)行排序,是按照字符編碼的順序進(jìn)行排序
\S  匹配任何非空白字符
\1 指定第一個(gè)子匹配項(xiàng)
*   匹配前面的子表達(dá)式零次或多次

console.log

問(wèn)題10: instanceOf有什么作用辰如??jī)?nèi)部邏輯是如何實(shí)現(xiàn)的普监?

  • instanceof用于判斷某個(gè)變量是否是某個(gè)對(duì)象的實(shí)例,返回值為true或false

  • instanceof
    通過(guò)探測(cè)obj.proto.proto... === Constructor.prototype來(lái)驗(yàn)證obj是否是Constructor的實(shí)例琉兜。
    :對(duì)象的proto屬性,一直往下查proto屬性是不是等于構(gòu)造函數(shù)的prototype屬性

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

問(wèn)題11:繼承有什么作用?

  • 繼承是指一個(gè)對(duì)象直接使用另一對(duì)象的屬性和方法凯正。可以提高復(fù)用性,省代碼
  • 作用:繼承劃分了類的層次性豌蟋,父類代表的是更一般廊散、更泛化的類,而子類則是更為具體梧疲、更為細(xì)化

問(wèn)題12: 下面兩種寫(xiě)法有什么區(qū)別?

//方法1
function People(name, sex){
    this.name = name;
    this.sex = sex;
    this.printName = function(){
        console.log(this.name);
    }
}
var p1 = new People('hunger', 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);
方法一
方法二
  • 方法一中:printName 方法直接寫(xiě)在函數(shù)Person中允睹,當(dāng)創(chuàng)建Person的實(shí)例時(shí),每個(gè)實(shí)例都有自己的printName 方法方法二中:printName 方法是寫(xiě)在Person.prototype中幌氮,當(dāng)創(chuàng)建Person的實(shí)例時(shí)缭受,每個(gè)實(shí)例中沒(méi)有自己的PrintName方法,當(dāng)實(shí)例調(diào)用PrintName時(shí)浩销,無(wú)法在自己體內(nèi)找到贯涎,所以會(huì)通過(guò)proto去原型里面找,也就是Person.prototype當(dāng)中去找慢洋。所以第二種方法中塘雳,PrintName是所有實(shí)例公用的陆盘。
  • 作用
    第二種在原型里面找方法:不用自己再開(kāi)辟內(nèi)存空間去創(chuàng)建一個(gè)方法

問(wèn)題13: Object.create 有什么作用?兼容性如何败明?

  • 使用 Object.create 創(chuàng)建對(duì)象
    ECMAScript 5 中引入了一個(gè)新方法:Object.create()可以調(diào)用這個(gè)方法來(lái)創(chuàng)建一個(gè)新對(duì)象隘马。新對(duì)象的原型就是調(diào)用 create
    方法時(shí)傳入的第一個(gè)參數(shù)
  • 兼容性
    這是ES5才有的方法對(duì)于低版本瀏覽器兼容效果不理想

問(wèn)題14: hasOwnProperty有什么作用? 如何使用妻顶?

  • 檢測(cè)對(duì)象的屬性是定義在自身上還是在原型鏈上酸员,有必要使用** [hasOwnProperty] **方法,所有繼承自 Object.proptotype 的對(duì)象都包含這個(gè)方法讳嘱。會(huì)返回一個(gè)布爾值
    [hasOwnProperty]是 JavaScript 中唯一一個(gè)只涉及對(duì)象自身屬性而不會(huì)遍歷原型鏈的方法幔嗦。
image.png

問(wèn)題15:如下代碼中call的作用是什么?

function Person(name, sex){
    this.name = name;
    this.sex = sex;
}
function Male(name, sex, age){
    Person.call(this, name, sex);   
    //這里的 call作用:改變作用域,可以引用構(gòu)造函數(shù),使Male實(shí)例可以訪問(wèn)PersonPerson的屬性
    this.age = age;
}

問(wèn)題16: 補(bǔ)全代碼,實(shí)現(xiàn)繼承

function Person(name, sex){
    this.name = name;
    this.sex = sex;
}
Person.prototype.getName = function(){
    console.log(this.name)
    console.log(this.age)
    console.log(this.sex)
};    
function Male(name, sex, age){
   Person.call(this,name,sex);
   this.age = age;
}

Male.prototype=Object.create(Person.prototype)
//or

// var Temp = function(){}
// Temp.prototype = Person.prototype;
// Male.prototype = new Temp();
// Male.prototype.construction = 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閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拔恰,居然都是意外死亡因谎,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門颜懊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)财岔,“玉大人,你說(shuō)我怎么就攤上這事饭冬∈苟欤” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵昌抠,是天一觀的道長(zhǎng)患朱。 經(jīng)常有香客問(wèn)我,道長(zhǎng)炊苫,這世上最難降的妖魔是什么裁厅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮侨艾,結(jié)果婚禮上执虹,老公的妹妹穿的比我還像新娘。我一直安慰自己唠梨,他們只是感情好袋励,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般茬故。 火紅的嫁衣襯著肌膚如雪盖灸。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天磺芭,我揣著相機(jī)與錄音赁炎,去河邊找鬼。 笑死钾腺,一個(gè)胖子當(dāng)著我的面吹牛徙垫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播放棒,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼姻报,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了间螟?” 一聲冷哼從身側(cè)響起逗抑,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寒亥,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體荧关,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溉奕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忍啤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片加勤。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖同波,靈堂內(nèi)的尸體忽然破棺而出鳄梅,到底是詐尸還是另有隱情,我是刑警寧澤未檩,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布戴尸,位于F島的核電站,受9級(jí)特大地震影響冤狡,放射性物質(zhì)發(fā)生泄漏孙蒙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一悲雳、第九天 我趴在偏房一處隱蔽的房頂上張望挎峦。 院中可真熱鬧,春花似錦合瓢、人聲如沸坦胶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)顿苇。三九已至峭咒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岖圈,已是汗流浹背讹语。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜂科,地道東北人顽决。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像导匣,于是被迫代替她去往敵國(guó)和親才菠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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

  • 1: apply贡定、call 赋访、bind有什么作用,什么區(qū)別 call 和 apply 都是為了改變某個(gè)函數(shù)運(yùn)行時(shí)的...
    高進(jìn)哥哥閱讀 251評(píng)論 0 0
  • 1:apply缓待、call 蚓耽、bind有什么作用,什么區(qū)別 call 和 apply 都是為了改變某個(gè)函數(shù)運(yùn)行時(shí)的上...
    進(jìn)擊的前端_風(fēng)笑影閱讀 276評(píng)論 0 0
  • 1. this2.原型鏈-instanceof實(shí)現(xiàn)3.繼承的實(shí)現(xiàn) ** this 相關(guān)問(wèn)題 ** ** 1鼎兽、 ap...
    饑人谷_阿靖閱讀 350評(píng)論 0 0
  • 1. apply、call 铣除、bind有什么作用谚咬,什么區(qū)別? call ,apply的作用:調(diào)用一個(gè)函數(shù)尚粘,傳入函數(shù)...
    Rising_suns閱讀 390評(píng)論 0 0
  • this 相關(guān)問(wèn)題 apply择卦、call 、bind有什么作用郎嫁,什么區(qū)別互捌? apply語(yǔ)法格式:function....
    小囧兔閱讀 268評(píng)論 0 0