不使用 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}
原文地址:https://www.cnblogs.com/panic404/p/13673729.html