javascript - 原型(prototype)是否应该与自执行匿名函数一起使用

标签 javascript

我之前用 C++ 和 Java 编写过很多程序,最近又更多地接触了 Javascript。

我一直在阅读 Javascript 中不同的类定义模式,并且熟悉(但不太熟悉)javascript 的原型(prototype)属性。

我还阅读了这篇文章,我发现它非常有用:

How Good C# Habits can Encourage Bad JavaScript Habits: Part 1

特别向下滚动到“自执行匿名函数:第 2 部分(公共(public)和私有(private))”部分,我非常喜欢它。

然而,这种模式没有使用 JavaScript 原型(prototype)。我想知道两者是否可以或应该调和?

例如,我声明了一个名为 mycharts 的“模块”,其中将包含多个图表。第一个图表是条形图。我有以下简化代码:

(function(mycharts, $, undefined) {
  mycharts.barChart = function(containerDiv, data) {

      // private variables specific to a given chart instance
      var chart = {};
      var _containerDiv = containerDiv;
      var _data = data;      
      var _barColor = 'blue';   // default color is blue

      // public getter/setter accessor
      chart.barColor = function(_) {
        if (!arguments.length) return _barColor;
        _barColor = _;
        return chart;
      };

      // public method
      chart.render = function() {    
        drawChart(_data.table, _data.values);
      };

      // private method
      function drawChart(table, values) {
        ...
      }

      return chart;
}(window.mycharts = window.mycharts || {}, $));

在这个例子中,我有一个“类”,barChart,它有三个“方法”,barColor()和render()(公共(public))和drawChart()(私有(private))。这些方法都不是使用 javascript 的原型(prototype)属性定义的。

我的问题是:对于这些方法中的任何一个或全部,我是否应该使用原型(prototype)?

更新:根据这里的答案和评论,客户将如何使用此模块:

var chart1 = mycharts.barChart('#chart1', data_set1)
                     .barColor('red');

var chart2 = mycharts.barChart('#chart2', data_set2)
                     .barColor('green'); 

chart1.render();
chart2.render();

是的,我更新了原始代码片段以返回图表(哎呀,我错过了那一行)。因此每次调用 mycharts.barChart() 时都会返回图表对象的各个实例。

更新 2: 向原型(prototype)添加“公共(public)”方法似乎很简单。只需将其定义与上面最初在自执行匿名函数中描述的非常相似即可。例如:

chart.prototype.render() = function() {...};

但是对于“私有(private)”方法执行此操作的正确方法是什么?我知道 private 并没有真正强制执行,但是上面的原始代码使它们在“类”上下文之外使用不方便,因此如果可能的话,我希望尽可能将私有(private)方法保持为“私有(private)”。

最佳答案

您“应该”的标准是什么?

如果要创建多个实例,原型(prototype)继承是很好的选择,否则闭包(和“模块模式”)适合单例和“私有(private)”成员。

请记住,javascript 中的“私有(private)”不提供任何安全性,它只是为您不希望公开的值和方法提供便利(例如,您可能拥有仅在对象并且不在外部使用,或者应该共享的值但您不想传递它们)。

JavaScript 的美妙之处在于,您可以在一个程序中使用多种 OO 模式,使用最适合每种情况的模式。这不是一个或另一个的问题,而是在特定情况下什么最适合。浏览更受推崇的库的代码,您会发现它们中的大多数(全部?)混合了原型(prototype)、模块和普通对象属性。

关于javascript - 原型(prototype)是否应该与自执行匿名函数一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16577692/

相关文章:

javascript - WebStorm 6 无法识别 Node.js Express 发布方法

javascript - 修改 JavaScript 数组属性

javascript - 使用下拉列表 html 中选定的值

javascript - 需要使用 JavaScript 打印文本框的内容,但它会不断重复每个条目

javascript - 如何删除/关闭 bootstrap css 通知?

javascript - window.getSelection() 给我选定的文本,但我想要 HTML

javascript - 使用push()将一个数组复制到另一个数组

javascript - 除了 PHP 或 JavaScript 之外,浏览器还有转义字符吗?

javascript - DOM 是否使用 jQuery 立即刷新?

javascript - knockout (js)到(html)头部