2017-03-20 36 views
0

假設我有一個類(比方說,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); 

    } 
} 

回答

1

你不這樣做它就像Dojo一樣。您只需將您的新類放在您想要使用它的位置的定義部分,Dojo就可以爲您提供安裝。所以,如果你保存在Object.js,你會使用這樣的:基於編輯

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

    return declare(null, { 

     constructor: function() { 
     }, 

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


    }); 

}); 

可補

那麼用你想要的方式,你不能道場的declare做系統。你必須以更傳統的方式來做到這一點。 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 = {} 
 
\t \t 
 
    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; 
 
    } 
 

 
\t 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/

但你怎麼把在道場?如百達在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

嗨,我覺得你的代碼假設'object'是單音調。我認爲OP從dojo類創建一個對象實例很有趣。 – GibboK

+0

@GibboK這兩個答案都不是我正在尋找...看到我的編輯 – scottyseus

+0

@scottyseus謝謝你的評論,你可以在你的問題中添加更多的細節...你想在哪裏發起新的對象();在另一個班級? – GibboK

0

,你可以在這個例子中看到,使用dojo模塊declare創建了兩個dojo類。 Dojo類似於Java抽象類。 當使用define定義類時,您可以隨意在代碼中啓動它。

在此示例中,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(); 
});