我正在阅读this article有关尝试在JavaScript中模仿OOP的危险,其中包括以下内容:



我是否正确假设,假定采用这种方法,我们应该替换以下代码:

function Rabbit() {
    this.speed = 3;
}

Rabbit.prototype = {
    this.getSpeed = function() {
        return this.speed;
    }
}

var rabbit = new Rabbit();

有了这个:
function RabbitFactory() {
    var rabbit = {
        speed: 3
    };

    Object.setPrototypeOf(rabbit, {
        getSpeed: function() {
            return this.speed;
        }
    })

    return rabbit;
}

var rabbit = RabbitFactory();

最佳答案

不,那是错的。您不应该使用Object.setPrototypeOf,最好使用Object.create(尽管它对结果没有影响)。而且,如果您每次都使用对象文字创建原型(prototype),那么它将失去所有共享优势,因此您应该完全删除该原型(prototype)或将其移到函数外以使其静态。编写工厂函数的正确方法是

const protoRabbit = {
    getSpeed: function() {
        return this.speed;
    }
};
function createRabbit() {
    var rabbit = Object.create(protoRabbit);
    rabbit.speed = 3;
    return rabbit;
}

var rabbit = createRabbit();

10-07 16:23