3

有没有在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

4 回答 4

3

假设我正确理解了这个问题,我认为没有任何好的方法。

根据Dojo Style Guid,私有变量和方法应该用前面的下划线标记(例如_myPrivateProperty_myPrivateMethod())。但是,这只是惯例,并没有将它们设为私有;他们仍然可以在课堂外访问。

正如您已经说过的那样,您可以创建私有静态变量。另一种方法是在类方法中创建变量,这些变量只能在大括号的范围内可见(正如Paul Kunze在他的回答中已经建议的那样)。然后,您可以在函数参数中将它们传递给类。但是,我猜这不是您想要的。

使用静态对象和访问它自己的对象属性的每个类实例可能会做一些聪明的事情。然而,这不会是不寻常和复杂的。我建议坚持使用下划线属性来标记您认为私有的变量的标准。

于 2012-11-06T15:37:40.887 回答
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

私人课程可能不是最好的解决方案,但至少它提供了真正的隐私。

于 2014-01-08T21:29:28.710 回答
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 定义我的类。让我知道它是否有效。

于 2012-11-06T09:41:19.820 回答
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';
      }
   },
});

这种方法的缺点是您需要明确执行任何继承,将“declare”函数的值限制为使用 dojo 加载程序。

于 2014-06-10T22:41:12.257 回答