Ph0*_*n1x 6 javascript oop closures prototype
通常我使用基于原型的标准OOP方法,我的类看起来像这样
var std = function(){
this.log = function(msg){ console.log("want to be private. " + msg) };
};
std.prototype = {
logInfo: function(msg){
this.log(msg);
}
};
Run Code Online (Sandbox Code Playgroud)
但在这种情况下log是公共方法,任何人都可以使用它.但我希望将其设为私有,但仍可在原型中声明的方法中使用.为此,我们需要关闭.代码将更改为此
var closureStd = (function(){
var std = function(){};
var log = function(msg){ console.log("I'm really private, youhooo!" + msg) };
std.prototype = {
logInfo: function(msg){
log(msg);
}
};
return std;
})();
Run Code Online (Sandbox Code Playgroud)
所以我的问题:是之间的区别是什么std和closureStd什么是我需要支付能够调用从原型私有方法的价格是多少?
std 和closureStd 有什么区别?
构造函数std在每次调用时都会创建一个新方法,而closureStd不会。你应该做到的
function std(){}
std.prototype = {
log: function(msg){ console.log("want to be private. " + msg) },
logInfo: function(msg){ this.log(msg); }
};
Run Code Online (Sandbox Code Playgroud)
当然,(您已经知道)log中的函数closureStd存储在(私有)变量中,而在实例上,可以std从每个实例(或其原型)的外部访问(并可覆盖)它。在闭包中,它是作用域链中的变量查找(可以假设是静态的),而对于方法来说,它是对象(及其原型链)上的属性查找,它可能是动态的,但在现代引擎中同样得到了优化。
为了能够从原型调用私有方法,我需要付出什么代价?
没有任何。模块模式常见且便宜,静态链中的变量查找非常快。我宁愿担心内存,因为您在构造函数方法中创建了如此多的方法实例。