zoukankan      html  css  js  c++  java
  • 不使用 new,创建一个实例对象

    首先,理清思路,使用 new 构造函数,会发生以下几个步骤:

    1. 创建一个新对象,这个对象的 _proto_ 属性指向构造函数的 prototype

    2. 此时构造函数执行环境的 this 指向这个新对象

    3. 执行构造函数中的代码,一般是通过 this 给新对象添加新的成员属性或方法

    4. 最后返回这个新对象

    通过函数,写一个实现 new 的功能:

    // func 是构造函数 ...datas 是需要传给构造函数的参数
    function myNew(func, ...datas) {
    // 创建一个空对象,并且指定原型为func.prototype var obj = Object.create(func.prototype);
      // 这一步也可以这么写:
        var obj = {}

        obj._proto_ = func.prototype
    // new构造函数时要执行函数,同时指定this func.call(obj, ...datas);
    // 最后return这个对象 return obj; }

    验证如下:
    function Test(name, age) {
      this.name = name;
      this.age = age;
    }
    
    myNew(Test, '小明', 18);
    // Chrome控制台会输出以下内容
    // Test {name: "小明", age: 18}
     
    通过显式 return 实现无 new 实例化:

    我们可以在构造函数中通过显式return来返回一个自定义的对象,jQuery就是这么做的。

    function Shadow() {
      this.name = 'jack';
      this.age = 18;
    }
    
    function jQuery() {
      return new Shadow();
    }
    
    var obj1 = jQuery();
    console.log(obj1)
    // Chrome控制台会输出以下内容
    // Shadow {name: "jack", age: 18}
    
    
    var obj2 = new jQuery();
    console.log(obj2)
    // Chrome控制台会输出以下内容
    // Shadow {name: "jack", age: 18}
  • 相关阅读:
    关于《浪潮之巅》
    C++知识点
    #ifndef/#define/#endif以及#if defined/#else/#endif使用详解
    typedef void(*Fun)(void);
    C#-StructLayoutAttribute(结构体布局)
    Web Services
    C# DataGridView
    VS2017编译boost库
    位与字节
    c++ map
  • 原文地址:https://www.cnblogs.com/panic404/p/13673729.html
Copyright © 2011-2022 走看看