dojo:在自己的类中实例化一个对象

时间:2017-03-20 21:26:41

标签: javascript dojo

假设我有一个类(让我们说,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);

    }
}

2 个答案:

答案 0 :(得分:1)

你不要像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);

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

        }
    });
});

希望现在更清楚了:))

答案 1 :(得分:0)

正如您在此示例中所看到的,使用dojo模块declare创建了两个dojo类。 Dojo与Java类似地抽象类。 使用define定义类时,您可以随意在代码中启动它。

在此示例中,YourMainClass constructor包含对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();
});