原生js:原型和原型链

66 阅读1分钟

原生js:原型和原型链

      // prototype是函数的一个属性,它是一个对象,它是函数new出来的对象的公共祖先
      // 如果prototype上属性和构造函数中属性重名,以构造函数中属性为主
      // 实例只可以查prototype上的属性或方法,无法增删改

      // 实例对象的属性__proto__指向构造函数的prototype,为什么通过Car.prototype可以访问到name?因为实例化时Car.prototype赋值给了__proto__

      // prototype对象中默认有constructor属性,它是一个函数,指向构造函数本身,并且可以修改
      /*
      重写prototype
        构造器可以修改,如果不写constructor,那么constructor默认指向Object
        实例化之前,重写prototype,实际上是重写构造器中的prototype,重写的结果会影响到实例对象
        实例化之后,重新prototype,重写的内容不会影响到实例对象,car.__proto__ === Car.prototype不成立
        
      */
      // __proto__也可以修改

      // 原型链:沿着__proto__往上一层一层地找属性值
      // 原型链的顶端是Object.prototype,它的__proto__属性为null
      // 实例对象只能更改自己,不能更改父级,但是可以更改父级的引用值

      // const obj1 = Object.create(obj) 将obj当做obj1的原型创建obj1
      // 不是所有的对象都继承于Object.prototype:const obj = Object.create(null),因此obj无法使用toString等方法