原型只能用于类中的公共方法吗?

时间:2013-11-05 23:32:51

标签: javascript jquery oop prototype

我有一个没有公共方法的js类。我在构造函数中使用var来创建这些方法并使用methodName()调用它们。我应该使用class.prototype.methodName,并使用this.methodName()在类中调用它们吗?这两种方法的优势是什么?我知道原型方法被复制到新实例,因此更快。但是它们应该只用于类的API吗?

1 个答案:

答案 0 :(得分:1)

JavaScript没有私有vairables,因此使用模拟它们的模式会导致一些开销(运行代码需要更多的CPU和内存)。私有代码可能难以维护。

模拟私有成员的模式可以分为两种不同的类型:

  1. 特定于实例的成员
  2. 原型成员
  3. 具体的实例可能类似于人的宗教,原型成员可能是doSomethingDangerous函数。在宗教返回值之前,您可能需要检查请求对象是否可以访问此私人信息。函数doSomethingDangerous不应该直接调用,因为你无法确定从外部调用时是否已经采取了正确的预防措施。

    可以访问“私有”成员的方法是特权方法。如果他们需要访问特定于实例的成员,则需要将他们放在构造函数体中(即声明实例特定成员的位置)。如果他们需要访问原型特定成员,他们需要与声明“私人”的人在同一个团体中。

    以下是一个例子:

    //constructor for Person
    var Person = function(){//<=start body of constructor function
      //to properly use prototype and not cause your code to consume
      // more resources to simulate something that isn't supported
      // in JavaScript "private" variable names usually start with _
      // so other programmers know not to set, get or call this directly
      this._normalPrivate;
      var religion = undefined;//<=instance specific private
      this.religion = function(){//<=privileged function
        console.log(religion);//<=can access private instance here
      }
    };
    Person.prototype=(function(){//<=start body of function returning object for prototype
      //All person instances share this, it's not instance specific
      var doSomethingDangerous=function(){//<=private prototype
        // doing something dangerous, don't want this to be called directly               
      };
      return {
        doSomething:function(){//<=priviliged method, can access private prototype
          //we cannot access religion because it's defined in a different 
          //  function body
          //make sure we can do something dangerous
          doSomethingDangerous();
        }
      };
    }());
    Person.prototype.constructor=Person;
    Person.prototype.anotherMethod=function(){
      //not a privileged method, cannot access doSomethingDangerous or religion
    };
    
    var ben = new Person();
    

    我从不使用这种模式,因为private仅用于指示其他程序员不要直接访问这些成员。如下例所示,您不希望程序员(包括您自己将来)执行以下操作:

    ben._doSomethingDangerous();
    

    要向其他程序员(以及将来自己)表明doSomethingDangerous是私有的,您可以在其前面添加下划线:

    Person.prototype._doSomethingDangerous=function(){...
    

    更多关于原型,继承,混合ins https://stackoverflow.com/a/16063711/1641941