美文网首页
js原型与原型链

js原型与原型链

作者: 男人宫 | 来源:发表于2022-12-13 13:19 被阅读0次
    /*
      ①构造函数的prototype属性 其实是指向一个对象 我们也称之为原型对象
      ②原型对象中包含在原型对象中定义的各种共享属性和方法.除此之外,还有一个constructor属性.它指向构造函数
      ③实例对象的__proto__属性也指向构造函数的原型对象
      ④当一个实例中,调用没有的属性和方法时,会沿着__proto__链找到原型对象,如果原型对象有则调用.如果没有,则会继续
      沿着构造函数原型对象的__proto__向上查找.最终查找到Object.prototype.如果Object.prototype也没有,则返回null
      ⑤isPrototypeOf() 判断某个proptotype对象和某个实例之间的关系
      ⑥hasOwnProperty() 判断某一个属性到底是本地属性,还是继承自prototype对象的属性
      */
      function Person() { } //构造函数
      Person.prototype.age = 18
      const p = new Person() //p是实例对象
     console.log(p.age);
      console.log(Person.prototype); //构造函数的prototype指向原型对象
      console.log(p.__proto__);  //实例的__proto__也指向原型对象(和上面的构造函数的原型对象是同一个对象)
      console.log(p.__proto__ === Person.prototype); //输出true.实例的__proto__和构造函数的prototype指向的是同一个原型对象
      console.log(Person === Person.prototype.constructor);//输出true. 原型对象的constructor指向关联的构造函数
      console.log(Object.prototype.__proto__ === null); //输出true
      console.log(Person.prototype.isPrototypeOf(p)); //输出true
      console.log(p.hasOwnProperty("age")); //输出false
    
    /*
     注意下面两种写法:
     Person.prototype.age = 18 
    Person.prototype = { age:18 }
    上面两者是由本质区别的,第二种会破坏原型对象.因为系统生成的原型对象是含有constructor这个属性的
    -------------------
    这是很重要的一点,编程时务必要遵守。下文都遵循这一点,即如果替换了prototype对象
    o.prototype = {};
    那么,下一步必然是为新的prototype对象加上constructor属性,并将这个属性指回原来的构造函数
     o.prototype.constructor = o;
    */
    

    相关文章

      网友评论

          本文标题:js原型与原型链

          本文链接:https://www.haomeiwen.com/subject/rgjhqdtx.html