0%

如何实现一个 new

如何实现一个new

个人题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function Demo(a, b) {
this.a = a;
this.b = b;
}
Demo.prototype.test = function () {
console.log(this.a);
};

function newConstructor(cons) {
return function () {
let result = {};
cons.apply(result, arguments);
result.__proto__ = cons.prototype;
return result;
};
}

let newDemo = newConstructor(Demo);
let a = newDemo(1, 2);
a.test();
  • 试了好一会试出来的
  • 一直用prototype方法不行,挠头….
  • proto 这个方法记得不是标准写法
  • 标准写法是contructor prototype?看答案吧

最高赞题解

1
2
3
4
5
function _new(fn, ...arg) {
const obj = Object.create(fn.prototype);
const ret = fn.apply(obj, arg);
return ret instanceof Object ? ret : obj;
}

先理清楚 new 关键字调用函数都的具体过程,那么写出来就很清楚了

  • 首先创建一个空的对象,空对象的proto属性指向构造函数的原型对象
  • 把上面创建的空对象赋值构造函数内部的this,用构造函数内部的方法修改空对象
  • 如果构造函数返回一个非基本类型的值,则返回这个值,否则上面创建的对象

结论

  • proto 不是标准对象,使用Object.create(fn.prototye)创建原型对象
  • 需要判断传入的对象是不是null或者undefined来判断是否返回实例对象
  • 不需要使用必包的方式进行返回(单例模式或许可以)

相关链接

如何实现一个new
最高赞作者github