2017-05-25 6 views
1

In Ruby kann ich ein Modul auf einem Objekt zur Laufzeit erweitern. Ich denke JavaScript kann die Funktion bekommen, aber ich kann es nicht zum Laufen bringen.So implementieren Sie Rubys Erweiterungsmodul in JavaScript

Ruby-OK läuft, hat das Objekt test1 und test2 Methoden:

class Test 

    def test1 
    puts "test1" 
    end 

end 

module Other 
    def test2 
    puts "test2" 
    end 
end 

test = Test.new 
test.extend(Other) 
test.test1 
test.test2 

JavaScript ein Typeerror zurückgibt: test_new.test2 ist keine Funktion

class Test { 
    test1(){ 
    console.log("test1") 
    } 
} 

class Other { 
    test2() { 
    console.log("test2") 
    } 
} 


console.log(Object.getOwnPropertyNames(Test.prototype)) 
console.log(Object.getOwnPropertyNames(Other.prototype)) 

var test = new Test 
var test_new = Object.assign(test, Other.prototype) 
test_new.test1() 
test_new.test2() 

Wer weiß, wie ich es bekommen kann ?

+3

Mögliche Duplikat von [Klonen nicht aufzählbare Eigenschaften in JavaScript] (https://StackOverflow.com/q/38316864/218196). –

+0

@FelixKling, ja, ich finde es scheint Ursache "Eigenschaften auf der Prototyp-Kette und nicht aufzählbar Eigenschaften können nicht kopiert werden", danke. – Tsao

+1

Mögliches Duplikat von [Klonen nicht aufzählbare Eigenschaften in Javascript] (https://stackoverflow.com/questions/38316864/cloning-non-enumerable-properties-in-javascript) – Tsao

Antwort

2

Dies scheint für mich zu arbeiten:

> class Test { test1(){ console.log("test1") }}  
> class Other { test2() { console.log("test2") }} 
> test = new Test 
Test {} 
> other = new Other 
Other {} 
> test.test1() 
test1 
> test["test2"] = other.test2 
> test.test2() 
test2 

Eine Instanz ist wirklich nur eine Reihe von Funktionen (in diesem Fall). Also, wenn Sie anrufen:

other.test2 

Es gibt die test2 Element other das ist die Funktion test2. Und dies:

> test["test2"] = other.test2 

fügen Sie einfach diese Funktion an die Anordnung von Funktionen für test. Welche können Sie dann anrufen:

> test.test2() 
+0

Danke, das ist Arbeit, aber wenn meine andere Klasse viele haben Methoden, und ich möchte nicht jede Methode einzeln anhängen, wie kann ich tun? – Tsao

+0

Iterate die anderen Methoden – jvillian

+0

Ich will nicht Iterate, der Code unten verwende ich scheint der beste Weg zumindest. – Tsao

Verwandte Themen