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

时间:2013-12-06 02:33:05

标签: javascript object prototype

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中的最佳做法是什么?

2 个答案:

答案 0 :(得分: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

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

setColour.call(this);

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

答案 1 :(得分:1)

我更喜欢这个:

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。