1

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();

由此看来,要拥有私有的、基于实例的、高效的功能,需要少量的执行时间吗?

它是否正确?

4

2 回答 2

1

您介绍的模块模式不是一个好的解决方案。它返回一个 object publik,但很可能你想模拟一个类,对吧?所以我猜你打算使用new运算符来创建 type 的新实例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();
于 2012-08-11T21:51:57.060 回答
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

因此,您可以从 iif 传递的构造函数创建实例,其中使用私有变量和函数。

于 2012-08-11T22:02:29.577 回答