原型、原型链

  • 构造函数
    js中,当使用new操作符来作用于某个函数时,这个函数被视为构造函数(构造器);

  • 原型
    js中,所有对象都具有一个私有属性: _proto_,所有的构造函数都具有一个原型对象:prototype,对象的 _proto_指向其构造函数的原型对象;

    例如
    fun(){...};
    var ob = new fun();
    则
    ob._proto_ = fun.prototype;
  • 原型链
    在上例中,实例对象ob的原型对象指向构造函数的原型对象fun.prototype,而fun.prototype作为一个对象,也有其自己的原型对象,依次类推,构成原型链;
    由于基本上所有的对象都是Object的实例,故原型链的最顶端为Object.prototype;Object.prototype的原型对象为null,js规定,null没有原型对象;
    实例继承原型链上的所有属性,当没有某个属性时,会沿着原型链向上寻找;
    //基本的原型链
    ob --> fun.prototype --> Object.prototype--> null

    var oc = Object.create(ob) 
    //使用Object.create创建对象,参数为原型对象
    //oc对应的原型链为
    oc --> ob --> fun.prototype--> Object.prototype--> null
    
    var oa = [1,2,3];
    //oa对应的原型链为
    oa --> Array.prototype--> Object.prototype --> null
  • 拓展原型链
    四种方式,以fun(){...},sun(){...}为例:
    //1
    var obj = new fun();
    obj.name = 'XXX';
    sun.prototype = obj;

    //2
    var obj = Object.create(fun.prototype);
    obj.name = 'XXX';
    sun.prototype = obj;

    //3 不推荐
    var obj = {name:'XXX'};
    Object.setPrototypeOf(obj,fun.prototype);
    sun.prototype = obj;

    //4 不推荐
    var obj = {
      name : 'XXX',
      _proto_ : fun.prototype
    }
    sun.prototype = obj;

内容提自> https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

posted @ 2021-11-30 14:22  HaSaki_Wang  阅读(50)  评论(0)    收藏  举报