首先,理清思路,使用 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}