实现new
function Dog(name) {
this.name = name;
}
Dog.prototype.bark = function() {
console.log(`${this.name} wants to bite you`);
}
const jackDog = new Dog("jack's dog");
jackDog.bark();
上面是一个简单的new使用场景,这里我们假设一种情况:在没有new关键字时,我们如何可以实现上述要求? 首先我们分析:Dog中使用了this,所以我们设计的new需要对this进行重定向,接着我们需要处理原型链上的方法,最后返回实例。
function _new(Factory, ...args) {
var obj = {};
// 处理原型链
obj.__proto__ = Factory.prototype;
// 更改this
const res = Factory.apply(obj, args);
// 实例返回一定是对象
return typeof res == 'object' ? res : obj;
}
const jackDog2 = _new(Dog, "jack's dog");
jackDog2.bark();
实现static
class Dog{
static race = “animal”;
}
我们给构造函数设置一个属性即可
function Dog() {}
function _static(Factory, key, value) {
Object.defineProperty(Dog, key, {
value,
writable: true,
enumerable: true,
configurable: false
});
}
_static(Dog, 'race', 'animal');