2016-09-05 5 views
0

Ich habe einige Objekte im Array und möchte einige Requisiten von Fabrik zu Objekt mit Typ - Datum hinzufügen.So fügen Sie dem vorhandenen Objekt eine Prototypeigenschaft hinzu

Ich muss alte Werte von diesem Objekt nicht entfernen. Ich versuche, es auf diese Weise zu tun:

angular.forEach($scope.things, function(item) { 
    if(item.type === 'date') { 
     item = DateFactory.prototype.createFactory(); 
    } 
    }) 

aber es funktioniert nicht, wo ich falsch? Plunker example

+0

Was ist 'createFactory'? Warum rufst du eine Methode vom Prototyp an? – Bergi

+1

In diesem Fall ist die Verwendung einer Factory in erster Linie ein Fehler, da diese Factory Klassen * (keine Instanzen einer Klasse) * erstellt/zurückgibt. Um genau zu sein: eine neue Inkarnation derselben statischen/unveränderten Klasse, jedes Mal wenn diese Fabrik aufgerufen wird. Was Sie wahrscheinlich in Ihrem Code-Beispiel tun möchten, ist etw. mehr wie '$ scope.things = $ scope.things.map (item => item.type === 'date'? Object.assign (new DateClass(), item): item)' Aber damit das funktioniert, du Sie müssen Ihren Code ändern, damit Sie anstelle einer Factory, die bei jedem Aufruf eine neue Date-Klasse erstellt, die DateClass bereitstellen. – Thomas

+0

und die Methode 'DateFactory.prototype.createFactory()' macht überhaupt keinen Sinn; weder, dass es existiert noch was es tut. – Thomas

Antwort

3

die item im forEach Ändern den Artikel nicht mutieren. Sie müssen stattdessen obj[key] verwenden:

angular.forEach($scope.things, function(item, key, obj) { 
    if(item.type === 'date') { 
     obj[key] = DateFactory.prototype.createFactory(); 
    } 
    }) 

plunker Aktualisiert

Außerdem sollten Sie die Instanz des Date-Objekt aus der Fabrik zurück:

return new date(); 

..und dann rufen Sie einfach die Methode :

obj[key] = DateFactory.createFactory() 
+0

ja! Es klappt! Ivan, könnte ich vorherige params im Objekt speichern? wie 'name' und 'type' im Beispiel? – YoroDiallo

+0

@YoroDiallo Natürlich. Sie können einfach alle neuen Eigenschaften an "Element" anhängen oder sie z. 'item.date' wie folgt:' obj [key] .date = DateFactory.createFactory(); ' –

+0

oh, das ist viel !!! – YoroDiallo

0

Zur Verknüpfung von Prototypen Verwendung unter Syntax: -

item = Object.create(Date); 
+0

aber wie kann ich es mit eckigen Fabrik machen? – YoroDiallo

+0

Sie übergeben einfach DateFactory, um eine Methode zu erstellen. wie item = Object.create (DateFactory); – CuriousGeek

+0

Leider funktioniert es nicht .. 'if (item.type === 'date') { item = Object.create (DateFactory); } ', Objekt ist keine Änderung – YoroDiallo

Verwandte Themen