例:var obj = new Base();
该步一共做了三件事:即
var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);
第一行,我们创建了一个空对象obj
第二行,我们将这个空对象的proto成员指向了Base函数对象prototype成员对象
第三行,我们将Base函数对象的this指针替换成obj。
实现一个new
MDN 的描述:
function _new(fn, ...arg) {
const obj = Object.create(fn.prototype);
const ret = fn.apply(obj, arg);
// 根据规范,返回 null 和 undefined 不处理,依然返回obj,不能使用
// typeof result === 'object' ? result : obj
return ret instanceof Object ? ret : obj;
}
构造函数返回的知识点
1、在构造函数里面,如果不写return的话默认就是返回创建的实例对象。
2、在构造函数里面,如果写了return的话
- 1)如果return的是一个基本数据类型的话比如,boolean,number,undefined等那么仍然返回实例对象;
- 2)如果return的是一个对象的话,则返回该对象。原本的指向实例对象的this会被无效化。