js原型链解析

1、字面对象【实例】和new的对象实例没有prototype, 只有__proto__。

    function fn () {}

    let obj1 = {
      value: 1,
    }

    let obj2 = new fn();

    console.log(obj1.prototype, obj2,prototype);  //Uncaught ReferenceError: prototype is not defined

2、类型上有prototype, 【类实例】上的__proto__指向的就是类型上的prototype。

    class myObject {

    }

    let obj = new myObject();

    console.log(obj.__proto__ === myObject.prototype);  

 3、创建类实例后,再在【类型】上的prototype添加属性或方法, 对类实例产生影响。不是对prototype重新赋值!!!

    // function myObject() {
    // }  也可以

    class myObject {};

    let obj = new myObject();

    myObject.prototype.value = 123;
    myObject.prototype.outValue = function () {
      console.log(this.value);
    }

    obj.outValue(); 

4、对【类型】的prototype重新赋值的差别。

    function myObject() {
    }

    // class myObject {};

    //----------------------------
    // myObject有上面两种声明(定义)方式,效果是不一样的!   
    //----------------------------

    let obj = new myObject();

    myObject.prototype.value = 123;
    myObject.prototype.outValue = function () {
      console.log(this.value);
    }

    myObject.prototype = {
      constructor: myObject,
      value: 666,
      logValue: function() {
        console.log(this.value);
      }
    }

    let obj2 = new myObject();

    try {
      obj2.outValue();
    }catch {
      console.log('myObject只能是function方式声明才可以,不然报错。');
    }

    try {
      obj2.logValue();
    }catch {
      console.log('myObject只能是class方式声明才可以,不然报错。');     
    }

5、__proto__与prototype的关系。 prototype里包含一个__proto__指针, 这个指针指向的是【类型】上的prototype。

这个指向过程是在constructor构造函数中完成的。所以生产【类型】的【实例】后,如果对prototype【整体】重新赋值,有可能会造成混乱。

这种混乱是 【4】代码中展示的那样, 由于类型声明用class 和 function 定义的不同,然后对prototpye【整体赋值】还是有差别的。

原文地址:https://www.cnblogs.com/Jiaojiawang/p/14044333.html