我看到人们在创建javascript对象时采用两种方法,他们有时会在主对象之外定义原型函数,有时他们会在内部执行。在对象内定义原型函数具有使用私有变量和函数的优势,在外部定义它的优势是什么?
function something (params) {
this.name = params.name;
this.color = params.color;
_someprivatefunction = function () {};
something.prototype.publicFunction = function () {_someprivatefunction() };
}
相反:
function something (params) {
this.name = params.name;
this.color = params.color;
_someprivatefunction = function () {};
}
something.prototype.publicFunction = function () {//can't call the private function here };
编辑:正如下面的评论所示,这是第三种选择(但现在问题是私有函数无法访问构造函数中的任何私有变量。)
(function () {
function something (params) {
this.name = params.name;
this.color = params.color;
}
_someprivatefunction = function () {};
something.prototype.publicFunction = function () {_someprivatefunction() };
}());
答案 0 :(得分:2)
我认为第一种方法的缺点是每次实例化一个新对象时都在运行原型赋值。似乎它会破坏使用原型的目的,因为它确实对每个创建的实例起作用。
答案 1 :(得分:1)
我想您知道,您的两个代码块并不提供相同的功能。第一个选项允许您调用_someprivatefunction()
或其他私有构造函数变量,而第二个选项不允许。所以,首先你必须决定这是否是一个要求。您的两个选项不提供相同的功能。
如果您确实想要访问私有功能,那么第三个选项如下:
function something (params) {
// initialize data members
this.name = params.name;
this.color = params.color;
// initialize private members
var aPrivateInstanceVar = 4;
// define private function
_someprivatefunction = function () { console.log(aPrivateInstanceVar);};
// define public method with access to private members and functions
this.publicFunction = function () {_someprivatefunction() };
}
这个新选项在技术上与第一个选项相同。但是(这可能只是我的意见),它感觉更干净。它在创建时动态地为对象分配属性,这是一个更常见的事情(就像分配给this.name
和this.color
)而不是在创建对象时为原型赋值时间。
另外,如果我遇到一些未注释的代码,其他人写的是你的第一个构造,我的第一个想法是:" gee,为什么不在原型之外完成对原型的这一分配构造"我甚至可能会尝试修复"它没有意识到它需要在那里。但是,如果我遇到了我提出的结构,它就像一个非常常见的设计模式,我不会想要#34;修复"代码(在此过程中意外破坏它)。