思路
- 3- 将空对象的
__proto__
和构造函数的 prototype
相连接
- 5- 判断构造函数的返回值是否为对象类型,如果是,则使用构造函数自己的返回值,如果不是,则返回我们创建的这个空对象
第五点可能有人不理解,意思就是:
我们的构造函数一般情况下是没有返回值的,所以
假设我在构造函数里手动写上了 return
,那么我就需要判断它返回的是不是一个对象
如果是,则返回它自定义的对象
如果不上,则返回我们自己的对象
ES5实现
function MyNew() { var obj = {}; var ConstructorFn = Array.prototype.shift.call(arguments); var args = Array.prototype.slice.call(arguments); if(typeof ConstructorFn !== 'function') throw Error(ConstructorFn + ' is not a constructor function'); Object.setPrototypeOf(obj, ConstructorFn.prototype); var result = ConstructorFn.apply(obj, args); return Object.prototype.toString.call(result).slice(8, -1) === 'Object' ? result : obj; }
|
ES6实现
function MyNew(ConstructorFn, ...args) { if(typeof ConstructorFn !== 'function') throw Error(ConstructorFn + ' is not a constructor function'); let obj = {}; Object.setPrototypeOf(obj, ConstructorFn.prototype); let result = ConstructorFn.call(obj, ...args); return Object.prototype.toString.call(result).slice(8, -1) === 'Object' ? result : obj; }
|
调用
function Persion(name, age) { this.name = name; this.age = age; }
let p = MyNew(Persion, '靓仔', 18)
console.log(p);
|
小提示
- 更推荐使用
setPrototypeOf
来链接原型