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

Paste_Image.png

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
}

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容