2012-03-25 12 views
1

Ich bin eine neue Klasse basierend auf der Base Klasse mit externen Methoden aus dem ext Obj.Erstellen Sie eine neue Instanz von Bind generiert obj

function Base(info) { 
    var self = this; 
    self.name = info.name; 
    self.createNewInstance = function (data) { 
     //I would like to identify the parent constructor 
     // in this case, the obj containing `filter` and `find` methods 
     // and use that to generate a new instance 
     return new self.constructor(data); 
    }; 
    return self; 
} 

var ext = { 
     filter: function() {/*...*/}, 
     find: function() {/*...*/} 
    }, 
    FinalClass = Base.bind(ext), 
    instance1 = FinalClass({name: 'John'}), 
    instance2 = instance1.createNewInstance({name: 'Mark'}); 

console.log(instance1); 
//--> {name: 'John', filter: [Function], find: [Function], createNewInstance: [Function]} 
console.log(instance2); 
//--> {name: 'Mark'} 

Aber wie Sie sehen können, ich möchte neue Instanz erstellen aus dem Inneren der FinalClass Klasse, die die binded Methoden zu verwenden, werden in der Lage und nicht nur die Base Klasse diejenigen. So instance2 würde auch filter, find und createNewInstance Methoden haben.

würde ich verschiedene Arten von Klassen verwenden, die die gleiche Base Klasse erben, so dass nur die Methode bind codieren in gäbe es keine Angst, ich bin arbeiten :(

dies möglich ist, zu erreichen?

Vielen Dank im Voraus

Antwort

2

ich fürchte, es einige Missverständnisse darüber, wie Sie Javascript Arbeiten Lassen Sie uns den Code analysieren.

var ext = { 
     filter: function() {/*...*/}, 
     find: function() {/*...*/} 
    }, 
    FinalClass = Base.bind(ext), 

Also, hier haben Sie eine Base Funktion gebunden an ext. Das bedeutet, dass Sie bei jedem Anruf FinalClassthisext anrufen.

instance1 = FinalClass({name: 'John'}), 

Hier sind Sie FinalClass rufen ein Objekt mit name gleich 'John' vorbei. Da in Base Sie haben:

function Base(info) { 
    var self = this; 
    self.name = info.name; 
    // ... 
    return self; 
} 

Und this die Instanz von ext in FinalClass ist, bedeutet dies, du bist eine neue Eigenschaftname-ext Objekt hinzufügen. Und ich denke, du willst das nicht. Dann geben Sie self zurück, es bedeutet, dass Sie wieder ext zurückgeben.

Danach haben Sie:

instance2 = instance1.createNewInstance({name: 'Mark'}); 

Lassen Sie uns in diesem Verfahren einen Blick:

self.createNewInstance = function (data) { 
    return new self.constructor(data); 
}; 

Da instance1 es nicht new Operator create verwenden, und es ist ext selbst, es bedeutet, Sein Konstruktor ist Object, nicht FinalClass, wie Sie wahrscheinlich erwartet haben.

Ich glaube, Sie können einen besseren Weg finden, was Sie wollen mit prototypischen Vererbung und Object.create.Allerdings sollten Sie in der Lage sein, um das Ergebnis zu erhalten, die Sie suchen einen Code ähnlich die Folge für die Anwendung:

function Base(info) { 
    this.name = info.name; 

    this.createNewInstance = function (data) { 
     return new this.constructor(data); 
    }; 

    return this; 
} 

var ext = { 
     filter: function() {/*...*/}, 
     find: function() {/*...*/} 
    }; 

function FinalClass(info) { 
    var object = Object.create(ext); 
    object.constructor = FinalClass; 

    return Base.call(object, info); 
} 

var instance1 = FinalClass({name: 'John'}), 
    instance2 = instance1.createNewInstance({name: 'Mark'}); 

console.log(instance1); 
console.log(instance2); 
// notice that `filter` and `find` won't probably be listed because are not "own properties", but the objects have them: 
console.log(instance1.filter); 
console.log(instance2.filter); 

Sie auch eine Dienstprogramm Methode in Base schreiben könnte, die ein wenig verallgemeinern, die funktionieren, so dass Ihr Code wird sieht so aus:

Hoffe es hilft, wenn Sie Zweifel haben oder ich Ihre Frage missverstanden habe, lass es mich wissen!

+0

wow danke viel ZER0 das war genau das, was ich gesucht habe, vielen Dank für diese großartige Antwort – zanona

Verwandte Themen