1.有如下代码,解释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();
prototype是函数的属性,__proto__
是对象object的属性。Person是函数,函数在JS中也是对象,所以Person函数有prototype和__proto__
属性。其prototype属性对应的值(Person.prototype)就是原型对象,这个原型对象(因为是对象)也有__proto__
属性,指向生成这个原型对象的构造函数的prototype即(object.prototype),Person函数的原型对象上还有一个属性constructor,这个属性指回构造函数Person。Person的另一个属性__proto__
指向生成这个Person函数对象的构造函数的prototype即Function.prototype。
p是构造函数Person生成的对象实例,由于p是对象,其__proto__
属性指向p的构造函数Person的prototype属性。
2.上例中,对对象 p可以这样调用 p.toString()。toString是哪里来的? 画出原型图?并解释什么是原型链。
当对象p调用toString()方法时,先在p对象自身属性中查找,如果有直接调用;如果没有则通过p对象的__proto__
指向,到生成p对象的构造函数Person的prototype原型上查找,如果有直接调用;如果没有再通过Person.prototype原型对象的__proto__
指向,到原型对象的构造函数object的prototype原型上查找,toString()方法是object.prototype上的方法,所以找到了。
原型链:JS中所有对象都有__proto__
隐式原型属性。当访问一个对象的属性时,先在对象自身属性上查找,如果没有就沿着对象的__proto__
指向,到其构造函数的prototype属性上继续向上查找。这个__proto__
指向构成的查找链就叫原型链。
3.对String做扩展,实现如下方式获取字符串中频率最高的字符
String.prototype.getMostOften =function(){
var str = this;
var obj = {};//空对象存储字符串的字符和出现的次数
for (var i = 0;i<str.length;i++){//每出现一次obj对象key对应的value+1
if(!obj[str[i]]){ //判断当前字符是否在obj对象中出现过
obj[str[i]] = 1; //如果没有出现过,次数为1
}else{
obj[str[i]] ++; //如果出现过,次数加1
}
};
console.log(obj)
var max=0
for(key in obj){//obj循环,把key对应的value值最大的那个取出来
if(obj[key]>=max){
max=obj[key]
console.log(key)
}
}
}
4.instanceOf有什么作用?内部逻辑是如何实现的?
instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。用来判断一个对象是不是某个构造函数的实例。内部逻辑:
instance(obj,Func)传入两个参数,第一个参数是要验证的对象,第二参数是构造函数,通过obj.__proto__
属性的指向不断向上查找其构造函数的prototype属性,顺着原型链查找时如果obj.__proto__
全等于其上级某个Function.prototype属性时返回true,此时表示obje对象是构造函数Function生成的对象实例。代码实现
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
}
本文版权归本人和饥人谷所有,转载请注明来源。