JS面向对象-原型链

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__指向构成的查找链就叫原型链。

JS面向对象-原型链_第1张图片
Paste_Image.png

3.对String做扩展,实现如下方式获取字符串中频率最高的字符
        String.prototype.getMostOften =function(){
                var str = this;
                var obj = {};//空对象存储字符串的字符和出现的次数
                for (var i = 0;i=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
}

本文版权归本人和饥人谷所有,转载请注明来源。

你可能感兴趣的:(JS面向对象-原型链)