問(wèn)題1: apply、call 、bind有什么作用仰猖,什么區(qū)別
call()
,apply()
,調(diào)用一個(gè)函數(shù)奈籽,傳入函數(shù)執(zhí)行上下文及參數(shù)
call()
方法接收參數(shù)列表饥侵,而apply()
接收參數(shù)數(shù)組
bind()
方法會(huì)創(chuàng)建一個(gè)函數(shù),函數(shù)體內(nèi)this對(duì)象的值會(huì)被綁定到傳入bind()
函數(shù)的值衣屏。
問(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)
}
//window 因?yàn)闆](méi)有傳值 默認(rèn)為window
問(wèn)題4:下面代碼輸出什么
document.addEventListener('click', function(e){
console.log(this);
setTimeout(function(){
console.log(this);
}, 200);
}, false);
//document window
問(wèn)題5:下面代碼輸出什么,why
var john = {
firstName: "John"
}
function func() {
alert( this.firstName )
}
func.call(john)
//John 調(diào)用func的方法來(lái)執(zhí)行john
問(wèn)題6: 以下代碼有什么問(wèn)題狼忱,如何修改
var module= {
bind: function(){
$btn.on('click', function(){
console.log(this) //this指什么 指$btn
this.showMsg(); //$btn沒(méi)有showMsg這個(gè)方法 會(huì)出錯(cuò)
})
},
showMsg: function(){
console.log('饑人谷');
}
}
修改后
var module= {
bind: function(){
var _this =this
$btn.on('click', function(){
console.log(this)
_this.showMsg();
})
},
showMsg: function(){
console.log('饑人谷');
}
}
問(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();
問(wèn)題8: 上例中,對(duì)對(duì)象 p可以這樣調(diào)用 p.toString()双霍。toString是哪里來(lái)的? 畫(huà)出原型圖?并解釋什么是原型鏈砚偶。
toString是從obj的原型里繼承而來(lái)的
任何類的prototype屬性本質(zhì)上都是個(gè)類Object的實(shí)例,
所以prototype也和其它實(shí)例一樣也有個(gè)proto內(nèi)部屬性洒闸,
指向其類型Object的prototype
調(diào)用方法和屬性時(shí)會(huì)優(yōu)先查找自身有沒(méi)有染坯,如果沒(méi)有則通過(guò)proto往上尋找,
還沒(méi)有則重復(fù)動(dòng)作丘逸,直到往上沒(méi)有proto返回undefined
這種結(jié)構(gòu)就叫原型鏈
問(wèn)題9:對(duì)String做擴(kuò)展单鹿,實(shí)現(xiàn)如下方式獲取字符串中頻率最高的字符
var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch); //d , 因?yàn)閐 出現(xiàn)了5次
String.prototype.getMostOften = function(){
var mostOften = 0;
var mostStr = 0;
var obj = {};
for(var i=0; i<this.length; i++){
if(obj[this[i]]){
obj[this[i]]++;
}
else{
obj[this[i]] = 1;
}
}
for(i in obj){
if(obj[i] > mostOften){
mostOften = obj[i];
mostStr = i;
}
}
return mostStr;
};
問(wèn)題10: instanceOf有什么作用??jī)?nèi)部邏輯是如何實(shí)現(xiàn)的深纲?
判斷一個(gè)對(duì)象是不是某個(gè)類型的實(shí)例
function instance_of(L, R) {//L 表示左表達(dá)式仲锄,R 表示右表達(dá)式
var O = R.prototype;// 取 R 的顯示原型
var L = L.__proto__;// 取 L 的隱式原型
while (true) {
if (L === null)
return false;
if (O === L)
return true;
L = L.__proto__;
}
}
問(wèn)題11:繼承有什么作用?
復(fù)用其他obj現(xiàn)成的屬性或方法
問(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('饑人谷', 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每次調(diào)用時(shí)都會(huì)創(chuàng)建一個(gè)新的方法,而方法2每次調(diào)用時(shí)不會(huì)創(chuàng)建新的方法湃鹊,而是使用prototype上的公共方法,節(jié)省了代碼量儒喊,提高了性能
問(wèn)題13: Object.create 有什么作用?兼容性如何币呵?
clone了一個(gè)新的prototype而不是直接把Person.prtotype直接賦值怀愧,因?yàn)橐藐P(guān)系,直接賦值會(huì)導(dǎo)致后續(xù)修改子類的prototype也修改了父類的prototype余赢,目前支持該方法的瀏覽器有IE9+,Firefox4+芯义, Safari5+,Opera12+ 和Chrome。IE6/7/8 不支持
問(wèn)題14: hasOwnProperty有什么作用妻柒? 如何使用扛拨?
可以判斷一個(gè)對(duì)象是否包含自定義屬性而不是原型鏈上的屬性
object.hasOwnProperty('屬性')//返回布爾值
問(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 表示調(diào)用Person的方法使用Male的參數(shù)
this.age = age;
}
問(wèn)題16: 補(bǔ)全代碼,實(shí)現(xiàn)繼承
function Person(name, sex){
this.name=name;
this.sex=sex;
}
Person.prototype.getName = function(){
return this.name
};
function Male(name, sex, age){
this.name=name;
this.sex=sex;
this.age=age;
}
Person.prototype.printName = function(){
console.log(this.name)
};
Male.prototype=Object.create(Person.prototype)
Male.prototype.getAge = function(){
return this.age
};
var ruoyu = new Male('若愚', '男', 27);
ruoyu.printName();