dojo的私有变量

时间:2012-11-06 09:29:12

标签: dojo

有没有一种在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;
    }
});

});

4 个答案:

答案 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加载器。