文章目录
一、内置new的时候做了什么
首先会像正常函数一样,产生私有上下文
1、创建当前内的一个实例(空实例对象)
2、让函数中的THIS指向这个对象
3、看函数的返回值,如果返回的是对象,则以自己返回的为主,否则把创建的实例对象返回
二、重写内置new
代码如下(示例):
function Dog(name) {
this.name = name;
}
Dog.prototype.bark = function () {
console.log('wangwang');
}
Dog.prototype.sayName = function () {
console.log('my name is ' + this.name);
}
/*
入参介绍
Ctor:constructor缩写 想创在哪一个构造函数的实例
params:实参集合 未来传递给构造函数的实参
*/
const _new = function _new(Ctor, ...params) {
// 对Ctor的格式做校验:必须是个函数 & 必须具备prototype属性 & 不能是生成器函数 & 排除Symbol/BigInt ...
if (Ctor === Symbol || Ctor === BigInt || Object.prototype.toString.call(Ctor) !== "[object Function]" || !Ctor.prototype) throw new TypeError(`Ctor is not a constructor`);
// 核心处理
let obj,
result;
// @1 创造当前类的一个实例{空实例对象}
// 实例对象.__proto__ 指向 构造函数.prototype
obj = Object.create(Ctor.prototype);
// @2 像普通函数执行一样把构造函数执行,让函数中的THIS指向创建的实例对象
result = Ctor.call(obj, ...params);
// @3 看函数的返回值,如果返回的是个对象,则以自己返回的为主,否则把创建的实例对象返回
if (result !== null && /^(object|function)$/.test(typeof result)) return result;
return obj;
};
======》》》》》》》》test
let sanmao = _new(Dog, '三毛');
sanmao.bark(); //=>"wangwang"
sanmao.sayName(); //=>"my name is 三毛"
console.log(sanmao instanceof Dog); //=>true