用javascript来实现new、static

170 阅读1分钟

实现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');