先上代码
function myNew(fn, args) {
let object = {};
object.__proto__ = fn.prototype;
let res = fn.apply(object, args);
return res instanceof Object ? res : object;
}
先对其进行测试然后再分析
编写一个构造函数
function Student(name) {
this.name = name;
}
Student.prototype.sayHello = function () {
console.log("I am " + this.name);
}
进行new操作
let Tom = myNew(Student, ['Tom']);
Tom.sayHello();
控制台输出:
分析
1 创建一个新对象
function myNew(fn, args) {
let object = new Object(); // 每次调用 myNew 都先创建一个新的对象
...
...
...
2 构造原型链(以后会写一篇讲解原型链的文章)
function myNew(fn, args) {
let object = new Object();
object.__proto__ = fn.prototype; // 使 object 的 __proto__ 指向构造函数的 prototype 对象
...
...
...
3 使用 apply 绑定 this
关于apply和call的知识:JS中的call()方法和apply()方法用法总结
function myNew(fn, args) {
let object = new Object();
object.__proto__ = fn.prototype;
let res = fn.apply(object, args); // 绑定 this
...
...
...
4 如果 res 处于 Object 的原型链上,返回 res,否则返回 object
function myNew(fn, args) {
let object = new Object();
object.__proto__ = fn.prototype;
let res = fn.apply(object, args);
return res instanceof Object ? res : object;
}