keywords: 原型鏈。
-
有如下代碼,解釋
Person
、prototype
、__proto__
、p
、constructor
之間的關聯。
function Person(name){
this.name = name;
}
Person.prototype.sayName = function(){
console.log('My name is :' + this.name);
}
var p = new Person("若愚")
p.sayName();
1、Person是p的構造函數,p是Person的實例;
2、prototype是Person的原型對象,p的__proto__
指向該原型對象;
3、constructor是prototype的屬性,指向p的構造函數Person;
-
上例中,對對象 p可以這樣調用 p.toString()。toString是哪里來的? 畫出原型圖?并解釋什么是原型鏈。
p的__proto__
指向Person.prototype,該prototype的__proto
指向Object.prototype。toString正式Object.prototype中的方法。
Person-p原型圖
每一個對象都有自己的原型(即__proto__
),而原型(prototype)本身也是對象,因而形成了一條原型鏈;比如a是b的原型,b是c的原型,以此類推。這就是原型鏈。
-
對String做擴展,實現如下方式獲取字符串中頻率最高的字符
String.prototype.getMostOften = function () {
var getArr = this.split('').sort().join('').match(/(.)\1*/g).sort(function(a,b) {
return a.length - b.length
})
return getArr.pop()[0]
}
var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch); //d , 因為d 出現了5次
-
instanceOf有什么作用?內部邏輯是如何實現的?
instanceof運算符返回一個布爾值,表示指定對象是否為某個構造函數的實例。常用于判斷值的類型:
var x = [1, 2, 3];
var y = {};
x instanceof Array // true
y instanceof Object // true
其實質是檢查右邊構造函數的原型對象(Function.prototype)是否在左邊對象的原型鏈(__proto__
)上。內部邏輯可以用下面的函數表達:
function isObjInstanceOffunc(obj,func) {
var __proto__=obj.__proto__;
do{
if(__proto__===func.prototype) return true;
}while(__proto__=__proto__.proto__)
return false;
}
參考資料:
instance