繁体   English   中英

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

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

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

需要注意的是,如果this是在使用setColour功能,你必须与当前值来调用它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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM