【发布时间】:2011-12-08 22:41:40
【问题描述】:
根据我对javascript的理解,原型方法不能访问构造函数作用域私有的变量,
var Foo = function() {
var myprivate = 'I am private';
this.mypublic = 'I am public';
}
Foo.prototype = {
alertPublic: function() { alert(this.mypublic); } // will work
alertPrivate: function() { alert(myprivate); } // won't work
}
这很有意义,但是有什么安全且良好的做法可以解决这个问题吗?由于使用原型提供了性能优势,因为成员函数只分配一次,我希望实现类似的功能,同时仍然能够访问我的私有变量。我认为它不会通过使用原型来工作,但是是否有另一种模式,例如工厂方法或闭包方法?有点像,
var fooFactory = function() {
var _alertPrivate = function(p) { alert(p); } // bulk of the logic goes here
return function(args) {
var foo = {};
var myprivate = args.someVar;
foo.mypublic = args.someOtherVar;
foo.alertPrivate = function() { _alertPrivate(myprivate); };
return foo;
};
}
var makeFoo = new fooFactory();
var foo = makeFoo(args);
我不确定每次创建新 Foo 时是否会创建 _alertPrivate 的新副本,或者是否有任何潜在的性能优势。目的是获得类似于原型设计的功能(因为它可以节省内存),同时仍然能够访问私有变量。
谢谢。
【问题讨论】:
-
你确定性能差异真的有问题吗?
-
@Qerub,可以。通常规则是,如果您需要创建大量实例,最好使用原型,因为每个实例都引用原型中仅创建一次的函数。我已经对其进行了基准测试,使用原型有显着的性能优势。想要启用继承还有一个明显的原因。
-
在以下帖子的末尾是一个链接,用于创建受保护的成员,而无需在每次创建实例时创建大量闭包:stackoverflow.com/questions/16063394/…
标签: javascript constructor closures private prototype-programming