我想我有两个问题.第一个问题是关于声明变量的许多方法.
说我有一个班:
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() { // ... })();
通过使用新的运算符,您将在一个步骤中声明和使用一个“匿名构造函数”,它将生成一个新的对象实例,但它是有效的,但我个人更喜欢使用“模块”模式方法来创建自己的对象实例(并避免新).
另外,阅读新的函数(){},我认为这不是真的直觉,可能会造成混乱,如果你不明白新的操作如何工作.
关于括号,它们是可选的,如果不添加参数,新的运算符将调用函数构造函数(参见ECMA-262,11.2.2).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。