zoukankan      html  css  js  c++  java
  • new 的实现原理

    自己封装一个new

    <script>
        // 创建一个构造函数
        function Father() {
          this.name = '小红';
          this.eat = function () {
            console.log('我叫'+this.name);
          }
        }
        /**
         * 1、在内存中创建一个新的对象;
         * 2、让this指向这个新的对象;
         * 3、执行构造函数里面的代码并给这个对象添加属性和方法;
         * 4、返回这个新对象;
         */
        // 使用new关键字来创建一个对象;
        var fa = new Father()
        console.log(fa);
    
        // ----------------------------------------
    
        /**
         * 实现new的过程
         */
        function _new() {
          // 1、创建一个空对象;
          var obj = {}
    
          // 利用 es6 数组的结构特点可以把函数的参数结构出来
          var [newfn, ...args] = [...arguments]
    
          // 2、将该对象 obj 的原型链 __proto__ 指向构造函数的原型 prototype,
          obj.__proto__ = newfn.prototype
    
          // 并且在原型链 __proto__ 上设置构造函数 constructor 为要实例化的 newfn
          obj.__proto__.constructor = newfn
    
          // 3、让构造函数 newfn 的this改变指向到 obj,并执行
          var result = newfn.call(obj, ...args)
    
          // 4、如果newfn执行后返回的是对象或函数类型,则返回该对象,否则返回 obj
          if (
            result &&
            (typeof result === 'object' || typeof result === 'function')
          ) {
            return result
          }
          return obj
        }
    
        // 构造函数;
        function f1(name, age) {
          this.name = name
          this.age = age
          this.eat = function() {
            return '我叫' + this.name + '今年' + this.age + '岁'
          }
        }
    
        // 创建一个对象;
        var obj2 = _new(f1, '小明', 18)
        console.log(obj2)
        console.log(obj2.name)  // 小明
        console.log(obj2.eat()) // 我叫小明今年18岁
    
      </script>
    
  • 相关阅读:
    FireFox 中 回把nextSibling为/n 换行时解释为undefinded
    陶哲轩实分析习题18.4.10
    单调可测集的测度运算
    数学分析_Tom Apostol_定理7.47
    Emacs+$\LaTeX$ 帮你写数学文章
    陶哲轩实分析引理18.4.2:半空间是可测集
    陶哲轩实分析习题18.4.10
    陶哲轩实分析引理18.4.2:半空间是可测集
    可测集的性质
    数学分析_Tom Apostol_定理7.47
  • 原文地址:https://www.cnblogs.com/ywnh/p/12339698.html
Copyright © 2011-2022 走看看