dojo:示例化自己类中的对象

cvxl0en2  于 2022-12-08  发布在  Dojo
关注(0)|答案(2)|浏览(154)

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

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

    return declare(null, {

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

        addNext: function(data) {

        }

    });

});

如何在这个类的定义中示例化它的示例,如下所示:

// 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);

    }
}
w1e3prcc

w1e3prcc1#

在Dojo中,你不需要这样做。你只需把新类放在你想使用它的地方的define部分,Dojo会为你进行示例化。所以,如果你保存在Object.js上,你可以这样使用它:

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

    return declare(null, {

        constructor: function() {
        },

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

    });

});

根据编辑补充

要想用你想要的方式去做,你不能用dojo的声明系统来做。你必须用更传统的方式去做。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);

JSF中间文件: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);

        }
    });
});

希望现在能更清楚:)

wd2eg0qa

wd2eg0qa2#

正如您在本例中看到的,使用dojo模块declare创建了两个dojo类。Dojo抽象类的方式与Java类似。当使用define定义类时,您可以在代码中随意启动它。
在本例中,YourMainClassconstructor包含对YourClass示例的引用,该示例是在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();
});

相关问题