zoukankan      html  css  js  c++  java
  • 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【整体赋值】还是有差别的。

  • 相关阅读:
    Django Form组件实例:登录界面[Form表单提交,Ajax提交]
    开张啦!
    CART剪枝
    TensorFlow全新的数据读取方式:Dataset API入门教程
    关于神经网络中的padding
    cs231n(一)
    协方差与pearson相关系数
    Auto Encoder
    markdown公式编辑参考
    Python使用日常
  • 原文地址:https://www.cnblogs.com/Jiaojiawang/p/14044333.html
Copyright © 2011-2022 走看看