2017-03-20 2 views
0

Angenommen, ich eine Klasse (sagen wir mal, LinkedListNode.js) wie unten definiert:Dojo: ein Objekt innerhalb der eigenen Klasse instanziiert

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

    return declare(null, { 

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

     addNext: function(data) { 

     } 

    }); 

}); 

Wie kann ich eine Instanz dieser Klasse innerhalb ihrer eigenen Definition instanziiert, wie unten: Hier

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

    }); 

}); 

ist ein Beispiel dafür, was ich versuche, in Java zu tun:

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

    } 
} 

Antwort

1

Sie nicht tun Es ist so in Dojo. Sie legen Ihre neue Klasse einfach in den define-Bereich des Ortes, an dem Sie sie verwenden möchten, und Dojo macht den Start für Sie. Also, wenn Sie auf Object.js gespeichert, würden Sie es wie folgt verwenden:

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

    return declare(null, { 

     constructor: function() { 
     }, 

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


    }); 

}); 

komplementiert basierend auf Änderungen

Nun, wie Sie wollen verwenden, können Sie es nicht mit Dojo declare System. Sie müssen es auf die traditionellere Art tun. Js ist eine freie Sprache, Sie können Dinge auf viele Arten tun. Sie haben also mehrere Methoden, um so etwas in JS zu tun. Hier sind 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/

Aber wie setzen Sie das in Dojo? Wie immer in JS es viele Möglichkeiten gibt, ist einer von ihnen dies:

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

dann würden Sie es wie folgt verwendet werden:

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

     } 
    }); 
}); 

Hoffe, dass es jetzt klarer ist :)

+1

Hallo, ich glaube, Sie übernehmen Code 'object' ist ein einzelner Ton. Ich denke, OP ist interessant beim Erstellen einer Objektinstanz aus einer Dojo-Klasse. – GibboK

+0

@GibboK keine dieser beiden Antworten ist, was ich suche ... siehe meine Bearbeitungen – scottyseus

+0

@scottyseus danke für Ihren Kommentar, könnten Sie mehr Details in Ihrer Frage hinzufügen ... wo wollen Sie initiieren neues Objekt(); in einer anderen Klasse? – GibboK

0

Wie können Sie In diesem Beispiel werden zwei Dojo-Klassen mit dem Dojo-Modul declare erstellt. Dojo abstrahiert Klassen ähnlich wie Java. Wenn eine Klasse mit definiert ist, können Sie es in Ihrem Code nach Belieben initiieren.

In diesem Beispiel enthält YourMainClass 's constructor einen Verweis auf eine Instanz von YourClass wo es initiiert wurde.

Live-Demo hier: 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(); 
}); 
Verwandte Themen