原型链

  • 有如下代码,解释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张图片
  • 当new一个构造函数的时候会创建一个对象,p为通过new Person创建的对象,构造函数Person.prototype等于被创建的对象p的__proto__

  • 构造函数Person下的Person.prototype内的constructor指向此构造函数Person本身。

  • 上例中,对对象 p可以这样调用 p.toString()。toString是哪里来的? 画出原型图?并解释什么是原型链。


    原型链_第2张图片
  • 图中可知,p.__proto__ === People.prototype, 在对象p中没有的方法将会在p.__proto__也就是People.prototype下寻找;People.prototype.__proto__ === Object.prototype,如果在People的内部对象People.prototype中没有的方法将会在People.prototype.__proto__也就是Object.prototype中寻找,最终toString方法在Object.prototype中找到,被对象p调用。

  • 原型链:Javascript的原型链是内部对象链:每个被创建的函数都有一个__proto__, 都指向创建这个函数的'父函数'的内部对象xxx.prototypeObject.prototype.__proto__为最终点,指向null。

  • 对String做扩展,实现如下方式获取字符串中频率最高的字符

//todo....
var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch); //d , 因为d 出现了5次
        //todo....
        String.prototype.getMostOften = function(){
            var str = this,
                dict = {},
                num = 0,
                keyMax;
            for(var i = 0; i < str.length; i ++){
                if (dict[str[i]] === undefined) {
                    dict[str[i]] = 1;
                } else {
                    dict[str[i]] ++;
                }
            }
            for(var key in dict){
                if(dict[key] > num){
                    num = dict[key];
                    keyMax = key;
                }
            }
            return keyMax + ':' + num;
        }
        var str = 'ahbbccdeddddfg';
        var ch = str.getMostOften();
        console.log(ch); //d , 因为d 出现了5次
  • instanceOf有什么作用?内部逻辑是如何实现的?
  • instanceof运算符返回一个布尔值,表示指定对象是否为某个构造函数的实例。
var x = [a,b,c];
var y = {};
x instanceof Array // true
y instanceof Object // true
  • 它的运算实质是检查右边构建函数的原型对象,是否在左边对象的原型链上。
p instanceof People// 等同于
People.prototype.isPrototypeOf(p)
  • 内部原理:
 function isObjInstanceOffunc(obj,func) {
  var __proto__=obj.__proto__;
  do{
    if(__proto__===func.prototype) return true;
  }while(__proto__=__proto__.proto__)
  return false;
}

本博客版权归 本人和饥人谷所有,转载需说明来源

你可能感兴趣的:(原型链)