【问题标题】:dojo's private variabledojo 的私有变量
【发布时间】:2012-10-26 05:33:41
【问题描述】:

在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;
    }
});

});

【问题讨论】:

    标签: dojo


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      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

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

      【讨论】:

        【解决方案3】:

        您可以包含私有变量...但一切都必须在构造函数中。

        [...]
        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 加载器。

        【讨论】:

          【解决方案4】:

          在构造函数中声明所需的私有成员怎么样?

              [...]
              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 定义我的类。请让我知道它是否有效。

          【讨论】:

          • privVar1 将被限定为 constructor 函数,所以我认为这不会起作用。
          • 函数“modPrivVar1”中的变量“privVar1”将被视为全局变量,而不是私有变量。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-08
          • 2011-05-25
          • 2013-06-22
          • 2020-06-12
          • 2012-07-26
          • 1970-01-01
          相关资源
          最近更新 更多