我想我有两个问题.第一个问题是关于声明变量的许多方法.
说我有一个班:
function clazz(a) { this.b = 2; var c = 3; this.prototype.d = 4; // or clazz.prototype.d = 4? } var myClazz = new clazz(1);
我在以下评估中是否正确:
a是具体实例的私有变量(即,不同的clazz实例将具有唯一和独立的变量’a’).它可以从clazz内进行访问:“a”.
b是一个具体实例的公共变量.它可以从clazz中被访问为’this.b’,从外部的clazz可以被访问’myClazz.b’.
c是一个静态或类特定的私有变量(即不同的clazz实例将共享相同的’c’变量).它可以从任何情况下的clazz访问为“c”,并且clazz的实例的变化反映在所有的clazz实例中.
d是一个静态/类特定的公共变量.它可以从任何地方通过’clazz.prototype.d’或’myClazz.prototype.d’访问.
我对我的理解变量方案的总体问题是,没有办法声明一个非静态的私有变量(即该类的每个实例的唯一版本).
第二个问题是关于不同类型的类声明.
我一直在使用:
var MySingleton = new function() {...};
创造单身人士.它是否正确?在这种情况下,我也不确定“新”关键字的效果,以及如下附加()函数括号到声明结尾:
var MySingleton = new function() {...}();
我一直在使用这个模式来声明一个类,然后实例化该类的实例:
function myClass() {...}; var classA = new myClass(); var classB = new myClass();
这是正确的方法吗?
解决方法
a是一个论证,仅在constructor function的范围内可用.
bis一个公共实例变量,在使用该构造函数创建的所有实例上可用.
c是一个私有变量,只能在构造函数中访问.
d声明是无效的,因为原型对象只能在constructor functions上使用,如Clazz.prototype.d = 3;如果这样做,变量将被共享,但是可以在一个具体实例,默认值将被隐藏(通过原型链).
对于“私有变量”,您可以使用您声明c的方式,例如:
function Clazz(){ var c = 3; // private variable this.privilegedMethod = function () { alert(c); }; }
特权方法是公共的,但是可以访问构造函数内部声明的“私有”变量.
var myInstance = { method1: function () { // ... },method2: function () { // ... } };
如果您想要在单身份实例上的私人会员,您可以:
var myInstance = (function() { var privateVar = ''; function privateMethod () { // ... } return { // public interface publicMethod1: function () { // all private members are accesible here },publicMethod2: function () { } }; })();
这被称为模块模式,它基本上允许您通过使用closures来将私有成员封装在对象上.
更多信息:
> Private Members in JavaScript
> Introduction to Object Oriented JavaScript
编辑:关于你发布的语法:
var mySingleton = new (function() { // ... })();
通过使用新的运算符,您将在一个步骤中声明和使用一个“匿名构造函数”,它将生成一个新的对象实例,但它是有效的,但我个人更喜欢使用“模块”模式方法来创建自己的对象实例(并避免新).
另外,阅读新的函数(){},我认为这不是真的直觉,可能会造成混乱,如果你不明白新的操作如何工作.