有没有一种在dojo中定义真实私有变量的好方法?
在dojo 1.7 / 1.8中,我找到了两种定义私有变量的方法,但它们都是静态私有的(由类的所有实例共享)
1.使用匿名立即功能:
define([
'dojo/_base/declare'], function(declare) {
'use strict';
return declare('test.Class2', null, (function(){
var a = 1;
return {
constructor: function(){
console.log('constructor');
},
geta: function(){
return a;
},
seta: function(v){
a = v;
}
};
})());
});
2.在模块定义中定义私有变量。
define([
'dojo/_base/declare'], function(declare) {
'use strict';
var a = 1;
return declare('test.Class1', null, {
constructor: function(){
console.log('constructor');
},
geta: function(){
return a;
},
seta: function(v){
a = v;
}
});
});
答案 0 :(得分:3)
假设我正确理解了这个问题,我认为没有什么好方法。
根据Dojo Style Guid,私有变量和方法应该用前面的下划线标记(例如 _myPrivateProperty 或 _myPrivateMethod())。但是,这只是惯例而不是私有;他们仍然可以在课堂外访问。
您可以按照自己的说法创建私有静态变量。另一种方法是在类方法中创建变量,这些变量只能在封闭大括号的范围内可见(正如Paul Kunze在他的答案中已经建议的那样)。然后,您可以在函数参数中传递它们。但是,我猜这不是你想要的。
可能可以使用静态对象做一些聪明的事情,并且每个类实例都可以访问它自己的对象属性。但是,这不会是不寻常和复杂的。我建议坚持使用underscored-properties来标记你认为是私有的变量。
答案 1 :(得分:1)
dojo文档有一个示例,它声明了正在返回的主声明之外的私有类。
define(["dojo/_base/declare"], function(declare){
var _MyPrivateItem = declare(null, {
someProperty: null
});
return declare(null, {
item: null,
constructor: function(){
this.item = new _MyPRivateItem();
}
});
});
http://dojotoolkit.org/reference-guide/1.9/dojo/_base/declare.html#dojo-base-declare
私人课程可能不是最佳解决方案,但至少它提供了真正的隐私。
答案 2 :(得分:0)
如何在构造函数中声明所需的私有成员?
[...]
return declare('test.Class1', null, {
constructor: function(){
console.log('constructor');
var = privVar1 = 'foo'; // this is how its normally done in JavaScript
},
[..]
//so called privileged Method is "public" but can access the "private var"
modPrivVar1: function(){
privVar1 = 'bar';
}
});
我不确定这是否有效,因为我没有使用dojo定义我的类。请告诉我它是否有用。
答案 3 :(得分:0)
您可以包含私有变量......但一切都必须在构造函数中。
[...]
return declare('test.Class1', null, {
constructor: function(){
console.log('constructor');
var privVar1 = 'foo'; // this is how its normally done in JavaScript
this.modPrivVar1 = function(){
privVar1 = 'bar';
}
},
});
这种方法的缺点是你需要明确地执行任何限制“声明”的值的继承。函数使用dojo加载器。