在JavaScript中编写对象方法的最佳方法是什么?

McS*_*man 1 javascript prototype object

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

DrawShape = function() {

}

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

DrawShape.prototype.square = function() {
    // draw logic here
}
Run Code Online (Sandbox Code Playgroud)

这种方法似乎是最有效的,因为每次实例化实例时都不会重写该方法.但是我发现要创建好的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";
}
Run Code Online (Sandbox Code Playgroud)

在这里,我创建了一个名为setColour的方法,该方法仅用于由其他方法运行.问题是该方法是公开的,可以被任何人或任何人调用.

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

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

Qan*_*avy 5

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
Run Code Online (Sandbox Code Playgroud)

请注意,如果thissetColour函数中使用,则必须使用当前值调用它this,因为您无法合理地绑定this到特定对象(据我所知,即使ES6也不会使这更容易):

setColour.call(this);
Run Code Online (Sandbox Code Playgroud)

无论如何,那些"你"必须伤害美国人的眼睛......