問答
1.有如下代碼,解釋Person、 prototype、proto、p、constructor之間的關聯。
2.上例中,對對象 p可以這樣調用 p.toString()。toString是哪里來的? 畫出原型圖?并解釋什么是原型鏈。
- 原型鏈:對象的屬性和方法,有可能是定義在自身,也有可能是定義在它的原型對象。由于原型本身也是對象,又有自己的原型,所以形成了一條原型鏈(prototype chain)。比如,a對象是b對象的原型,b對象是c對象的原型,以此類推。
如果一層層地上溯,所有對象的原型最終都可以上溯到Object.prototype,即Object構造函數的prototype屬性指向的那個對象。那么,Object.prototype對象有沒有它的原型呢?回答可以是有的,就是沒有任何屬性和方法的null對象,而null對象沒有自己的原型。 - “原型鏈”的作用是,讀取對象的某個屬性時,JavaScript引擎先尋找對象本身的屬性,如果找不到,就到它的原型去找,如果還是找不到,就到原型的原型去找。如果直到最頂層的Object.prototype還是找不到,則返回undefined。
- 如果對象自身和它的原型,都定義了一個同名屬性,那么優先讀取對象自身的屬性,這叫做“覆蓋”(overiding)。
- 需要注意的是,一級級向上,在原型鏈尋找某個屬性,對性能是有影響的。所尋找的屬性在越上層的原型對象,對性能的影響越大。如果尋找某個不存在的屬性,將會遍歷整個原型鏈。
3.對String做擴展,實現如下方式獲取字符串中頻率最高的字符
String.prototype.getMostOften = function(){
var json = {},
max = 0,
result;
for(var i=0;i<this.length;i++){
if(json[this[i]]!==undefined){
json[this[i]] += 1//這個字母出現一次就在后面加一次1, 給json設key&value,value就是出現次數
}else{
json[this[i]]=1;
}
}
for(var key in json){
if(json[key]>max){//經常使用這種方式比較大小。。假設一個值誰比他大就等于誰最后再返回出來,該值就是最大值
max = json[key];
result = key;
}
}
return result;
}
var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch); //d , 因為d 出現了5次
4.instanceOf有什么作用?內部邏輯是如何實現的?
- instanceof運算符返回一個布爾值,表示指定對象是否為某個構造函數的實例。instanceof運算符的左邊是實例對象,右邊是構造函數。它的運算實質是檢查右邊構建函數的原型對象,是否在左邊對象的原型鏈上。
//用于判斷Func的原型對象是否在obj的原型鏈上
function isInstanceOf(obj,Func){
var O = obj.__proto__;
var F = Func.prototype;
while(true){
if(O===F){
return true
}
O = O.__proto__;
if(O===null){
return false
}//當最終指向null,也就是Object的原型對象
}
}
微信截圖_20161102165949.png