Dojo类和静态函数

时间:2017-06-13 09:36:35

标签: javascript dojo amd

我有一个名为Test

的班级
define([
  "dojo/_base/declare"
], function (declare) {
  var ctrl = declare(null, {

    fields : "field1,field2",
    constructor: function () {

    },
    checkFields : function(){
    }

  });

  ctrl.testStatic = function () {
    console.log(fields);// null
    console.log(this.fields);// null
  }
  return ctrl;
});

require(["my/Test"], function(Test){
  Test.testStatic();
});

是否可以在我的类Test中访问我的字段属性?

解决此问题的最佳方法是什么?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

第一件事

是在声明块之外声明函数的原因:

ctrl.testStatic = function () {
    console.log(fields); 
    console.log(this.fields);  
}

如果你在声明中宣布它会很好地运作

第二件事:

当需要你的Test类时,想想最后实例化它,然后访问它的方法如下:

require(["my/Test"], function(Test){
  var test = new Test()
  test.testStatic();
});

请参阅下面的代码段(无法在此处的单独文件中重新创建!!):

require([
  "dojo/_base/declare"
], function(declare) {
  // updated as Gibbok correction (capitalize)
  var Ctrl = declare(null, {
    fields : "field1,field2",
    constructor: function () {
      
    },
    checkFields : function(){
      
    },
    testStatic : function() {
      console.log(this.fields);// null
    }
  });
  
  var ctrl1 = new Ctrl();
  ctrl1.testStatic();

});
<script>
  window.dojoConfig = {
    parseOnLoad: false,
    async: true
  };
</script>


<script src="//ajax.googleapis.com/ajax/libs/dojo/1.12.1/dojo/dojo.js"></script>

否则,如果要将类用作静态对象,则(不使用new关键字进行访问)。 使用dojo declare classy是没用的,所以声明应该是:

define([], function () {
  var ctrl = {
    fields : "field1,field2",
    constructor: function () {

    },
    checkFields : function(){

    },
    testStatic : function() {
        //console.log( fields ) this will fail fields is not defined reference error
        console.log(this.fields);
    }
  };

  return ctrl;
});

然后是

的预期输出
require(["my/Test"], function(Test){
  Test.testStatic();
});

将是:

  

FIELD1,FIELD2

答案 1 :(得分:1)

如果您希望将属性void FixedUpdate() { // IF KEY IS DOWN, MOVE // if (isForward == true) { var vect = Vector3.Cross(pushForward, Vector3.down); float turn = Input.GetAxis("Vertical"); rb.AddTorque(vect * torque * turn); Debug.Log("Moving Forward"); } } 保持为静态@bRIMO,则答案是有效的。

如果您希望将属性fields设置为静态,则意味着您要为fields的每个实例添加属性fields,您应该填充直接在Ctrl中的fields属性。否则constructor中的更改将反映在fields的所有实例中,仅当属性不是基本类型时才有效。

除了@bRIMO的好答案之外,我还要加上:

  • 对于首字母Ctrl使用大写字母对类名使用dojo约定。

使用非静态成员修改了代码段:

&#13;
&#13;
Ctrl
&#13;
require([
  "dojo/_base/declare"
], function(declare) {

  var Ctrl = declare(null, {
    constructor: function () {
        // NOTES! property is declared in the constructor
        this.fields = "field1,field2";
    },
    checkFields : function(){     
    },
    testStatic : function() {
      console.log(this.fields);
    }
  });
  
  var ctrl1 = new Ctrl(); 
  ctrl1.testStatic(); // field1,field2

  var ctrl2 = new Ctrl(); 
  ctrl2.fields = 'xyz';
  ctrl2.testStatic(); // xyz

  ctrl1.testStatic(); // field1,field2
});
&#13;
&#13;
&#13;