keywords: 原型鏈雕欺。
-
有如下代碼岛马,解釋
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();
1蹦浦、Person是p的構(gòu)造函數(shù)扭吁,p是Person的實(shí)例;
2盲镶、prototype是Person的原型對(duì)象侥袜,p的__proto__
指向該原型對(duì)象;
3溉贿、constructor是prototype的屬性枫吧,指向p的構(gòu)造函數(shù)Person;
-
上例中宇色,對(duì)對(duì)象 p可以這樣調(diào)用 p.toString()喇澡。toString是哪里來(lái)的? 畫(huà)出原型圖?并解釋什么是原型鏈屯蹦。
p的__proto__
指向Person.prototype屎媳,該prototype的__proto
指向Object.prototype弥搞。toString正式Object.prototype中的方法。
每一個(gè)對(duì)象都有自己的原型(即__proto__
)抢蚀,而原型(prototype)本身也是對(duì)象镀层,因而形成了一條原型鏈;比如a是b的原型皿曲,b是c的原型唱逢,以此類推。這就是原型鏈屋休。
-
對(duì)String做擴(kuò)展坞古,實(shí)現(xiàn)如下方式獲取字符串中頻率最高的字符
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 , 因?yàn)閐 出現(xiàn)了5次
-
instanceOf有什么作用??jī)?nèi)部邏輯是如何實(shí)現(xiàn)的劫樟?
instanceof運(yùn)算符返回一個(gè)布爾值痪枫,表示指定對(duì)象是否為某個(gè)構(gòu)造函數(shù)的實(shí)例。常用于判斷值的類型:
var x = [1, 2, 3];
var y = {};
x instanceof Array // true
y instanceof Object // true
其實(shí)質(zhì)是檢查右邊構(gòu)造函數(shù)的原型對(duì)象(Function.prototype)是否在左邊對(duì)象的原型鏈(__proto__
)上毅哗。內(nèi)部邏輯可以用下面的函數(shù)表達(dá):
function isObjInstanceOffunc(obj,func) {
var __proto__=obj.__proto__;
do{
if(__proto__===func.prototype) return true;
}while(__proto__=__proto__.proto__)
return false;
}
參考資料:
instance