dojo:在其自身内实例化一个对象 class

dojo: instantiate an object within its own class

假设我有一个 class(比方说,LinkedListNode.js)定义如下:

// LinkedListNode.js
define([
    "dojo/_base/declare"
] , function (declare) {

    return declare(null, {

        constructor: function(data) {
            this._data = data;
        },

        addNext: function(data) {

        }

    });

});

如何在其自己的定义中实例化此 class 的实例,如下所示:

// LinkedListNode.js
define([
    "dojo/_base/declare"
] , function (declare) {

    return declare(null, {

        constructor: function(data) {
            this._data = data;
        },

        addNext: function(data) {
            this._next = new LinkedListNode(data);
        }

    });

});

这是我在 Java 中尝试做的事情的示例:

class LinkedListNode {
    private int data;
    private LinkedListNode next;

    public LinkedListNode(int data) {
        this.data = data;
    }

    public void addNext(int data) {

        // How can I execute this same statement in JavaScript/Dojo?
        this.next = new LinkedListNode(data);

    }
}

在 Dojo 中你不会那样做。您只需将新的 class 放在您想要使用它的地方的定义部分,Dojo 就会为您创建实例化。所以如果你在 Object.js 上存钱,你会像这样使用它:

define([
    "dojo/_base/declare",
    "yourpath/Object"
] , function (declare, object) {

    return declare(null, {

        constructor: function() {
        },

        test: function() {
            object.whatever();
        }


    });

});

根据编辑进行补充

好吧,想怎么用就怎么用,道场的声明系统做不到。你必须以更传统的方式来做。 Js是一门免费的自由语言,你可以用很多方式做事。所以你有几种方法可以在 JS 中做类似的事情。这里有 3 个:

function LinkedListNode(data) {
    this.addNext = function(data) {
        this.next = new LinkedListNode(data);
        return this.next;
    }
    
    this.data = data;
}

var ll1 = new LinkedListNode(777);
ll1.addNext(555).addNext(333);

console.log(ll1.next.data);
console.log(ll1.next.next.data);

function LinkedListNodeV2(data) {
    var self = {}
  
    self.addNext = function(data) {
        self.next = new LinkedListNodeV2(data);
        return self.next;
    }
    
    self.data = data;
    return self
}

var ll2 = LinkedListNodeV2(777);
ll2.addNext(555).addNext(333);

console.log(ll2.next.data);
console.log(ll2.next.next.data);

class LinkedListNodeV3 {

    constructor(data) {
        this.data = data;
    }

 addNext(data) {
        this.next = new LinkedListNodeV3(data);
        return this.next;
    }
}

var ll3 = new LinkedListNodeV3(777);
ll3.addNext(555).addNext(333);

console.log(ll3.next.data);
console.log(ll3.next.next.data);

JSFiddle:https://jsfiddle.net/s1pemgbk/2/

但是您如何将其放入 Dojo 中?因为在 JS 中总是有很多方法,其中之一是:

// LinkedListHelper.js
define([
    "dojo/_base/declare"
] , function (declare) {

    class LinkedListNode {

        constructor(data) {
            this.data = data;
        }

        addNext(data) {
            this.next = new LinkedListNode(data);
            return this.next;
        }
    };

    var self = {};

    self.getLLInstance = function(data) {
        return new LinkedListNode(data);
    }

    return self;
});

那么你会像这样使用它:

define([
    "dojo/_base/declare",
    'project/helpers/linkedListHelper',
], function (
    declare,
    linkedListHelper
) {
    return declare([_WidgetBase, _TemplatedMixin], {
        postCreate: function () {
            this.inherited(arguments);

            var ll = linkedListHelper.getLLInstance(777);
            ll.addNext(555).addNext(333);
            console.log(ll.next.data);
            console.log(ll.next.next.data);

        }
    });
});

希望现在更清楚了:)

如您在此示例中所见,使用 dojo 模块 declare 创建了两个 dojo classes。 Dojo 抽象 classes 类似于 Java。 当使用 define 定义 class 时,您可以随意在代码中启动它。

在此示例中,YourMainClassconstructor 包含对已启动的 YourClass 实例的引用。

现场演示: https://jsfiddle.net/gibbok/uw17etqg/

require(["dojo/_base/declare", "dojo/_base/lang"], function(declare, lang) {
  var YourClass = declare(null, {
    constructor: function(name, age, residence) {
      this.name = name;
      this.age = age;
      this.residence = residence;
    },
    print: function() {
      alert(this.name);
    }
  });
  var YourMainClass = declare(null, {
    constructor: function(name, age, residence) {
      this.yourClassInstance = new YourClass('foo', 'bar', 'zoo');
      this.yourClassInstance.print();
    }
  });
  var yourMainClass = new YourMainClass();
});