基于私有,基于实例的高效函数|需要执行时间

时间:2012-08-11 20:06:30

标签: javascript

JavaScript语言不直接支持类或基于类的继承。

但是,JavaScript中有许多类的实现。

我见过的所有实现都需要使用自调用函数来创建基于实例的私有函数。

功能有隐私

var foo = function(){ /* private to foo here */ };

但是如果你原型化它,你现在拥有公共的,基于实例的高效成员。

foo.prototype.func = function(){ /* private to func */ }; // foo.func in public now.

如果你把这个函数放在这样的foo中

var foo = function() { 
    var funcInner = function(){}; 
}; // funcInner is now re-defined in each call to foo.  In-efficient.

你得到了隐私,但现在效率低下。

因此,拥有私有的,基于实例的高效函数的唯一方法是使用模块模式(或类似的自调用模式)

    var NS = (function(){ 
    var private = function(){ /* code */ }; // only created once b.c. in module pattern.
    var publik = {};
        publik.funcPublic = function(){ /* code */ };
    return publik;
})();

调用

NS.funcPublic();

从这看起来似乎有私有的,基于实例的高效函数,需要少量的执行时间吗?

这是对的吗?

2 个答案:

答案 0 :(得分:1)

您提供的模块模式不是一个好的解决方案。它返回一个对象publik,但很可能你想模拟一个类,对吧?所以我想您打算使用new运算符来创建publik类型的新实例。这不适用于对象,因此每当您想要创建新实例时,您都需要调用此匿名函数 - 并且每个实例最终都会有一个新的私有函数。 (不确定这是否可以理解,请询问您是否需要澄清!)

我必须提供一个在现实中运作良好的解决方案:

var Car = (function() {
    // Private functions as local variables:
    var privateFunc = function(self) {};        

    // Create a local variable that will be the class (a function, to
    // enable the "new" keyword.
    var Car = function() {};

    // Attach public methods to the prototype! That's the most efficient way.
    Car.prototype.publicFunc = function() {
        privateFunc(this); // the private functions needs probably
                           // to know about the current instance
    };

    // Now return only the completed "class", to get it out into the wild
    return Car;
})();

var bmw = new Car();
bmw.publicFunc();

答案 1 :(得分:1)

不确定你的意思。它是关于在从立即调用的函数(iif)创建的对象中保持私有吗?那会是你的意思吗?

var x = (function(){ 
    var n = 1;                                          //n = private
    var getSetN = function(val){ n+=val||0; return n; } // getSetN = private
    var public = function(){};
    public.prototype.getset = function(val){ return getSetN(val||0); };
    return public;
}());
var y = new x; z = new x;
y.getset(1);  //=> 2
y.getset(5);  //=> 7
z.getset(1);  //=> 8
y.getset();   //=> 8

Ergo,您可以从iif提供的构造函数中创建实例,其中使用了私有变量和函数。