Javascript:从原型方法调用私有方法

six*_*ude 20 javascript

我确信这一定是一个非常常见的问题但是在对互联网进行了几个小时的搜索之后,我还没有找到答案.这是一个问题:

假设我有一个名为哺乳动物的界面.每个哺乳动物都必须能够入睡和进食.(将来我可能会抛出Mammal类的异常来强制孩子实现这个功能).

function Mammal() {};

Mammal.prototype.eat = function() {};

Mammal.prototype.sleep = function() {};
Run Code Online (Sandbox Code Playgroud)

现在假设我有一个实现Mammal类的Dog类:

function Dog() {};

Dog.prototype = new Mammal();

Dog.prototype.eat = function() {
    ...
};

Dog.prototype.sleep = function() {
    ... 
};
Run Code Online (Sandbox Code Playgroud)

狗的吃功能非常复杂,我想使用辅助功能.我无法弄清楚最好的办法是什么.以下是要点:

  • 永远不应该从dog类的外部调用辅助函数,所以理想情况下它应该是私有的.
  • eat函数无法访问私有函数(原型无法访问私有函数)
  • 我可以将辅助函数放入一个privalaged函数,但是:
    • 这仍然是一个公共职能 - >即:每个人都有权称呼它
    • 它不会是原型的一部分,所以每只狗都需要有自己的辅助功能.如果有很多狗,这似乎效率低下.
  • 我不能使eat函数成为一个私有函数,因为为了使原型继承工作,它需要成为原型的一部分.

问题:如何从原型函数调用私有函数?或者更一般地说:当一个对象(子对象)继承自另一个对象(父对象)时,子方法应该如何使用辅助函数,是否可以使这些私有?

Ale*_*yne 36

Dog在闭包中定义你的"类".然后你可以拥有共享的priveliged功能.只要知道this在调用它时你必须小心正确绑定.

var Dog = (function() {
  function Dog() {};

  // Common shared private function, available only to Dog.
  var privateHelper = function() { ... };

  Dog.prototype = new Mammal();

  Dog.prototype.eat = function() {
    privateHelper()
    // Or this if the helper needs to access the instance.
    // privateHelper.call(this);
    ...
  };

  return Dog;
})();
Run Code Online (Sandbox Code Playgroud)

原型上的函数仍然只是一个函数.因此,遵循与任何其他函数相同的范围和闭包访问规则.因此,如果您定义整个Dog构造函数和原型以及作为自执行函数的隐蔽范围岛,欢迎您在不暴露或污染公共范围的情况下尽可能多地共享.

这正是CoffeeScript类编译成JS的方式.

  • @sixtyfootersdude使函数公开,在其前面加上`_`表示它是内部的最佳实践 (2认同)
  • @AlexWayne但私人会给予运行时间罚款. (2认同)
  • @AlexWayne也许它可以忽略不计但是Chrome 33.0.1729目前差不多有近70%.请参阅:http://jsperf.com/private-or-public-proto-helper#bs-results (2认同)