在javascript中,有没有一种完美的方法来定义类

时间:2013-03-05 06:44:52

标签: javascript class prototype

我正在寻找一种完美的方法来定义课程。 “完美”在这里意味着:“

  1. 创建实例不会创建方法的副本。
  2. 公共职能可以轻松(不是太麻烦)访问私人变量
  3. 例如,方式1:

    function Foo1() {
      var private1;
      this.publicMethod1 = function() {//create instance will create copy of this function}
    }
    

    不符合上述第1条规则。

    另一个例子,方式2:

     function Foo2() {
          var private2;
    
        }
     Foo2.prototype.Method2 = function() {//cannot access private2}
    

    不符合上述第2条规则。

    那么可以满足这两个规则吗?感谢。

4 个答案:

答案 0 :(得分:1)

在JavaScript中,它更多地是关于约定。私有属性或方法首先使用下划线定义,如_private。有了一些助手,您可以轻松地上课。我觉得这个设置很简单,只需要一个助手inherits来扩展类,而不是使用多个参数,而是在对象props中传递,只需在继承的类上调用“super”{ {1}}。例如,使用模块模式:

arguments

关于私有变量“问题”只是坚持例如属性的约定,并在需要其他所有私有时使用闭包。

答案 1 :(得分:0)

function Foo3() {
    this.private = {};
}

Foo3.prototype.set_x = function (x) {
    this.private.x = x;
};

答案 2 :(得分:0)

长话短说:不,不是。您无法使用可以访问private变量的方法扩展原型。至少如果通过closure将这些私有变量设为私有。

但是,javascript中的惯例是您使用下划线标记您的私有字段,例如_myPrivateField。这些仍然是公开的,但我已经看到这个解决方案在许多图书馆中使用,我也更喜欢这种风格来满足你的第一条规则。

答案 3 :(得分:0)

一个基本的例子如下:

Foo = function(id)
{
    // private instances.
    var _id;
    var _self = this;

    // constructor
    _id = id;

    // private method
    function _get()
    {
        return _id;
    };

    // public function
    _self.set = function(id)
    {
        _id = id;
    };
    _self.get = function()
    {
        return _get();
    };
};

var bar = Foo(100);
console.log( bar.get() );
bar.set(1000);
console.log( bar.get() );

我建议您使用prototype