我敢肯定,这肯定是一个很常见的问题,但是在搜寻了几个小时的互联网之后,我没有找到答案。这是问题:

假设我有一个称为哺乳动物的接口(interface)。每个哺乳动物都必须能够睡眠和进食。 (将来,我可能会为哺乳动物类抛出异常,以迫使 child 实现该功能)。

function Mammal() {};

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

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

现在,假设我有一个实现哺乳动物类的Dog类:
function Dog() {};

Dog.prototype = new Mammal();

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

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

狗的进食功能非常复杂,我想使用辅助功能。我还没有弄清楚做到这一点的最佳方法是什么。这里是考虑的要点:
  • 永远不要在dog类的外部调用helper函数,因此理想情况下,它应该是私有(private)的。
  • eat函数不能访问私有(private)函数(原型(prototype)不能访问私有(private)函数)
  • 我可以将辅助函数放入私有(private)函数中,但是:
  • 这仍然是一个公共(public)功能->即:每个人都有权调用它
  • 它不会成为原型(prototype)的一部分,因此每条狗都需要具有自己的帮助程序功能。如果有很多狗,这似乎效率很低。
  • 我不能使eat函数成为特权函数,因为为了使原型(prototype)继承能够正常工作,它必须成为原型(prototype)的一部分。

  • 问题:如何从原型(prototype)函数调用私有(private)函数?或更笼统地说:当一个对象(子对象)从另一个对象(父对象)继承时,子方法应如何使用辅助函数,并且有可能将其私有(private)化吗?

    最佳答案

    在闭包中定义您的Dog“class”。然后,您可以共享特权功能。只是知道您在调用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;
    })();
    

    原型(prototype)上的功能仍然只是一个功能。因此,遵循与任何其他函数相同的作用域和闭包访问规则。因此,如果您定义了整个Dog构造函数和原型(prototype)以及一个作为自我执行功能的僻静的作用域孤岛,那么欢迎您随意共享而不暴露或污染公共(public)作用域。

    这正是CoffeeScript classes编译成JS的方式。

    关于javascript - Javascript:从原型(prototype)方法调用私有(private)方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8580540/

    10-13 09:36