我有一个没有公共方法的js类。我在构造函数中使用var来创建这些方法并使用methodName()调用它们。我应该使用class.prototype.methodName,并使用this.methodName()在类中调用它们吗?这两种方法的优势是什么?我知道原型方法被复制到新实例,因此更快。但是它们应该只用于类的API吗?
答案 0 :(得分:1)
JavaScript没有私有vairables,因此使用模拟它们的模式会导致一些开销(运行代码需要更多的CPU和内存)。私有代码可能难以维护。
模拟私有成员的模式可以分为两种不同的类型:
具体的实例可能类似于人的宗教,原型成员可能是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