实现一个new操作符

new操作符用来生成一个实例对象,作用于构造函数,构造函数与其他函数无差别,Just首字母大写,还是约定俗成的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
const fakeNew = (construct, ...args) => {
	const obj = Object.create(construct.prototype, {
		constructor: {
			value: construct,
			configurable: true,
			writable: true,
		}
	});
	const result = construct.call(obj, ...args);
	return (typeof result === 'object') ? result: obj;
}

值得注意的是如果构造函数返回了一个对象,则new操作符的结果为该对象,所以在代码的最后用typeof来查看result的数据类型。 最开头的Object.create的第二个参数也可以用起来,因为所有的原型对象默认都会有一个constructor属性,指向构造函数,可以通过Object.getOwnPropertyDescriptor查看:

1
2
3
function Person() {}
Object.getOwnPropertyDescriptor(Person.prototype, 'constructor');
// {writable: true,enumerable: false,configurable: true,value: ƒ}

我省略了enumerable描述属性,因为不写的属性会被false填充,这里我们希望enumerablefalse,这样就不会被for...in遍历到,所以我没写。

updatedupdated2020-10-052020-10-05