問(wèn)答:
1.有如下代碼,解釋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
是一個(gè)構(gòu)造函數(shù)九秀,函數(shù)也是對(duì)象奢啥,那么Person
就擁有屬性prototype
和__proto__
第喳。prototype
指向Person
的原型對(duì)象,即Person.prototype
缩擂,而__proto__
指向構(gòu)造Person
的函數(shù)的原型,即Function.prototype
添寺。 -
Person.prototype
是Person
的原型對(duì)象胯盯,擁有屬性constructor
和__proto__
。constructor
指向Person
计露,__proto__
指向Object.prototype
博脑。 -
p
作為Person
構(gòu)造出來(lái)的實(shí)例對(duì)象憎乙,擁有屬性__proto__
,指向Person.prototype
叉趣。
2.上列中泞边,對(duì)對(duì)象p可以調(diào)用p.toString
。toString
是哪里來(lái)的君账?畫(huà)出原型圖繁堡?并解釋什么是原型鏈。
toString
來(lái)自于Object.toString
乡数。原型圖如下:
原型鏈.jpg
當(dāng)訪問(wèn)
p.toString
時(shí)椭蹄,先在對(duì)象p
的基本屬性中查找,發(fā)現(xiàn)沒(méi)有净赴,然后通過(guò)__proto__
去Person.prototype
中查找绳矩,還是沒(méi)有,再通過(guò)__proto__
去Object.prototype
中查找玖翅,最終找到了toString
翼馆,完成訪問(wèn)。當(dāng)訪問(wèn)一個(gè)對(duì)象的屬性或方法時(shí)金度,先在基本屬性中查找应媚,如果沒(méi)有,再沿著
__proto__
這條鏈向上找猜极,這就是原型鏈中姜。
3.對(duì)String
做擴(kuò)展,實(shí)現(xiàn)如下方式獲取字符串中頻率最高的字符
String.prototype.getMostOften = function(){
var str = this;
var obj = {}; //創(chuàng)建一個(gè)obj對(duì)象用來(lái)儲(chǔ)存每個(gè)字符元素和它出現(xiàn)的次數(shù)
for (var i = 0;i<str.length;i++){
if(!obj[str[i]]){ //判斷當(dāng)前字符是否在obj對(duì)象中出現(xiàn)過(guò)
obj[str[i]] = 1; //如果沒(méi)有出現(xiàn)過(guò)跟伏,次數(shù)為1
}else{
obj[str[i]] ++; //如果出現(xiàn)過(guò)丢胚,次數(shù)加1
}
}
console.log(obj);
var max = 0; //初始化一個(gè)最大次數(shù)
var mostWord= []; //創(chuàng)建一個(gè)mostWord數(shù)組儲(chǔ)存出現(xiàn)最多的字符
for(var key in obj){
if(obj[key] > max){
max = obj[key];
mostWord = []; //找到出現(xiàn)次數(shù)最多的字符后,清空數(shù)組受扳,將該字符儲(chǔ)存到數(shù)組中携龟。
mostWord.push(key);
}
else if( obj[key] === max){
mostWord.push(key) //若有多個(gè)字符出現(xiàn)的次數(shù)相同,也儲(chǔ)存到數(shù)組中勘高。
}
}
var result = mostWord.join("和");
console.log("出現(xiàn)次數(shù)最多的字符為:"+result+",出現(xiàn)"+max+"次");
}
運(yùn)行結(jié)果
4.instanceof
有什么作用峡蟋??jī)?nèi)部邏輯是如何實(shí)現(xiàn)的?
- 作用:
instanceof
運(yùn)算符用來(lái)檢測(cè)某個(gè)構(gòu)造函數(shù)的原型是否存在于要檢測(cè)的對(duì)象的原型鏈上华望。在判斷引用類(lèi)型的時(shí)候蕊蝗,可以用到該運(yùn)算符。 - 內(nèi)部邏輯:
instanceof
運(yùn)算符的第一個(gè)變量是一個(gè)對(duì)象:obj立美,第二個(gè)對(duì)象一般是一個(gè)構(gòu)造函數(shù):Func匿又。判斷邏輯是:沿著obj.__proto__
這條線來(lái)找,如果找到一個(gè)對(duì)象是Func.prototype
,就返回true建蹄,如果找到終點(diǎn)都沒(méi)有找到碌更,就返回false裕偿。用函數(shù)表示就是:
function instanceof(obj,Func){
var __proto__ = obj.__proto__;
do{
if(__proto__ === Func.prototype) return true;
if(!__proto__) return false;
}while(__proto__ = __proto__.__proto__)
return false;
}
instanceOf
運(yùn)算符其實(shí)表達(dá)就是一個(gè)對(duì)象的原型鏈結(jié)構(gòu)。結(jié)合問(wèn)答2的原型圖可以看一些有趣的例子:
function Person(name){
this.name = name;
}
Person.prototype.sayName = function(){
console.log('My name is :' + this.name);
}
var p = new Person("若愚")
p.sayName();
console.log(p instanceof Person) //true;
console.log(p instanceof Object) //true;
console.log(Person instanceof Function) //true;
console.log(p instanceof Function) //false;
console.log(Function instanceof Function)//true;
console.log(Function instanceof Object) //true;
console.log(Object instanceof Function) //true;
instanceof
本文版權(quán)歸本人和饑人谷所有痛单,轉(zhuǎn)載請(qǐng)注明來(lái)源嘿棘。