2015-02-03 4 views
8

Ich benutze Angular.js 1.3.x. In früheren Versionen von Angular (einschließlich 1.3.0-beta5), der folgende Code der Eigenschaften vom Prototyp direkt auf das neue Objekt kopieren würde: Wie man Prototyp mit angular.copy() behält?

function x() {}; 
x.prototype.logIt = function() {console.log("it")}; 
var src = new x(); // x has custom properties on the prototype 
var dest = {}; 
angular.copy(src, dest); 
dest.logIt(); // "TypeError" in Angular 1.3.0+ 

jedoch in Angularjs 1.3.0+, die Eigenschaften

total verloren, trotz der Tatsache, vom Prototyp sind, dass die migration guide for 1.2 to 1.3 sagt:

Dies ändert angular.copy, so dass er den Prototyp des ursprünglichen Objekts auf das kopierte Objekt gilt. Zuvor würde angular.copy Eigenschaften der Prototypkette des Originalobjekts direkt auf das kopierte Objekt kopieren.

Wie behalte ich die Eigenschaften vom Prototyp?

Antwort

12

Während der Kommentar im commit linked to aus den Migrationsleitfaden sagt:

Dies ändert angular.copy, so dass er den Prototyp des ursprünglichen Objekts auf das kopierten Objekt gilt.

Dies ist nur wahr, wenn das Zielargument angular.copy(source, [destination]); nicht angegeben ist. Wenn destination angegeben wird, werden nur die direkten Eigenschaften des Objekts are copied.

Die Lösung ist nur das source Objekt in die angular.copy Funktion zur Verfügung zu stellen, die destination Parameter Weglassen:

function x() {}; 
x.prototype.logIt = function() {console.log("it")}; 
var src = new x(); 
var dest = angular.copy(src); // no second parameter 
dest.logIt(); // logs "it" 
+2

Für jedermann mit Object.defineProperty und diese zu lesen: Die Eigenschaft muss als zählbare definiert werden : True, damit es im kopierten Objekt erscheint. –

+0

Protip: Der einfachste Weg, 'Foo's Prototyp beim Kopieren zu erhalten, ist' angular.copy (Foo, Foo.prototype); '. – Bryce

+0

Dies beantwortet nicht direkt die Frage, bietet nur eine Begründung für das Problem. – trysis

Verwandte Themen