function Dog(name) {
this.name = name;
}
Dog.prototype.bark = function () {
console.log('wangwang');
}
Dog.prototype.sayName = function () {
console.log('my name is ' + this.name);
}
let sanmao = new Dog('三毛');
sanmao.sayName();
sanmao.bark();
重写new方法
Ctor:constructor 要创造这个构造函数的实例 Dog
params: 获取传递的剩余实参集合 ['三毛']
function _new(Ctor, ...params) {
初学者写法
1.创建一个实例对象 实例.__proto__===Ctor.prototype
let obj = {};
obj.__proto__ = Ctor.prototype;
2.把Ctor当做普通函数执行,只需要让方法中的THIS指向这个实例对象
let result = Ctor.call(obj, ...params);
3.判断函数的返回结果:如果返回的是原始值类型(含undefined)则默认返回实例对象
if (result == null) return obj;
if (typeof result === "object" || typeof result === "function") return obj;
return result; */
性能提升写法
__proto__ IE中屏蔽对他的操作
Object.create(obj) 创造一个空的实例对象,并且让obj作为其原型链的指向空对象.__proto__===obj
if(typeof Ctor!=="function"||(Ctor===Symbol||Ctor===BigInt)||!Ctor.prototype) throw new TypeError('Ctor is not a constructor');
let obj,result;
obj = Object.create(Ctor.prototype);
let result = Ctor.call(obj, ...params);
if (result == null||!/^(object|function)$/i.test(typeof result)) return obj;
return result;
}
let sanmao = _new(Dog, '三毛');
sanmao.bark();
sanmao.sayName();
console.log(sanmao instanceof Dog);