构造函数与原型---原型链

原型:每个对象都有原型(__proto__)指向其构造函数的原型对象(prototype属性)

原型链:

每个对象都会在其内部初始化一个属性,就是 prototype (原型),当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去 prototype 里找这个属性,这个prototype 又会有自己的 prototype ,于是就这样一直找下去,也就是我们平时所说的原型链的概念

    function Star(name, age) {
      this.name = name;
      this.age = age;
      this.sing = function () {
        console.log(this.name + '会唱歌');
      }
    }

    // 每个对象从被创建开始就和 “另一个对象”上继承属性,“另一个对象”就是原型
    // 由对象和原型组成的链就叫原型链
    var ldh = new Star('刘德华', 3);

    //每一个构造函数都有prototype属性,该属性指向一个对象
    //实例化对象都会有一个属性__proto__,指向构造函数的原型对象prototype
    console.log(Star.prototype);    //constructor: ƒ Star(name, age)
    console.log(Star.prototype == ldh.__proto__);    //true

    //Star的原型对象prototype的构造函数construor指向Star本身
    console.log(Star.prototype.constructor == Star);   //true

    //Star原型对象prototype.__proto__指向Object原型对象prototype
    console.log(Star.prototype.__proto__ == Object.prototype);    //true

    //Object原型对象prototype的构造函数construor指向Object构造函数
    console.log(Object.prototype.constructor == Object);    //true

    //Object原型对象prototype.__proto__指向空null
    console.log(Object.prototype.__proto__);    //null
  1. 当访问一个对象的属性和方法时,首先查找这个对象自身有没有该属性
  2. 如果没有,就查找他的原型(__proto__指向的prototype对象)
  3. 如果依然没有,就查找原型对象的原型(Object的原型对象)
  4. 以此类推一直找到Object为止(null)
  5. 若整个原型链都没有查到,返回undefined

如:访问 ldh 对象的 aaa属性,已知ldh上并无该属性,Star、Object也无,故结果返回undefined

console.log(ht.aaa); // undefined

如果想要ldh对象可以访问的aaa属性,可以在Star的prototype添加该属性

    Star.prototype.aaa = 'aaa'
    console.log(ldh.aaa); // aaa


版权声明:本文为qq_44302255原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。