用JavaScript编写对象方法的最佳方式是什么

What is the best way to write object methods in JavaScript?

本文关键字:最佳 方式 是什么 方法 对象 JavaScript      更新时间:2024-04-20

OOP建议只公开您希望用户能够访问的变量和方法。我一直在为我的对象使用公共方法声明(即原型)。

DrawShape = function() {
}
DrawShape.prototype.circle = function() {
    // draw logic here
}
DrawShape.prototype.square = function() {
    // draw logic here
}

这个方法似乎是最有效的,因为该方法不是每次实例化实例时都重写的。然而,我发现,为了创建好的DRY、模块化代码,我必须创建只供其他方法(即私有方法)访问的方法。

DrawShape = function() {
}
DrawShape.prototype.circle = function() {
    var colour = this.setColour();
    // draw logic here
}
DrawShape.prototype.square = function() {
    var colour = this.setColour();
    // draw logic here
}
DrawShape.prototype.setColour = function() {
    return "blue";
}

在这里,我创建了一个名为setColour的方法,它只打算由其他方法运行。问题是该方法是公开的,任何人或任何东西都可以调用它。

我可以将该方法移到对象构造函数中。。。但这意味着我不再节省内存(即,每次实例化实例时都会重写内存),也意味着我必须将所有其他方法移到构造函数中。

在创建对象时,JavaScript的最佳实践是什么?

IIFE(立即调用函数表达式)的威力:

DrawShape = function() {
}
(function () {
    DrawShape.prototype.circle = function() {
        var colour = setColour();
        // draw logic here
        console.log(typeof setColour); // function
    }
    DrawShape.prototype.square = function() {
        var colour = setColour();
        // draw logic here
        console.log(typeof setColour); // function
    }
    function setColour() {
        return "blue";
    }
    console.log(typeof setColour); // function
})();
console.log(typeof setColour); // undefined

注意,如果在setColour函数中使用this,则必须使用当前值this来调用它,因为您无法合理地将this绑定到特定对象(据我所知,即使是ES6也无法使其变得更容易):

setColour.call(this);

不管怎样,那些"u"一定伤害了美国人的眼睛

我更喜欢这个:

DrawShape = function() {
    var circle = function() {
        var colour = setColour();
        // draw logic here
    };
    var square = function() {
        var colour = setColour();
        // draw logic here
    };
    var setColour = setColour() {
        return "blue";
    };
    return {
        circle: circle,
        square: square
    };
};

我觉得它看起来不错。准备好也很好。

编辑

根据评论,我们可以重写如下:

DrawShape = function() {
    this.circle = function() {
        var colour = setColour();
        // draw logic here
    };
    this.square = function() {
        var colour = setColour();
        // draw logic here
    };
    var setColour = setColour() {
        return "blue";
    };
    return this;
};

我真的不喜欢IIFC。