2015-02-03 14 views
8

Tôi đang sử dụng Angular.js 1.3.x. Trong các phiên bản trước của góc (bao gồm 1.3.0-beta5), đoạn code sau sẽ sao chép các thuộc tính từ nguyên mẫu trực tiếp đến đối tượng mới:Làm thế nào để giữ nguyên mẫu với angular.copy()?

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+ 

Tuy nhiên, trong Angular.js 1.3.0+, các thuộc tính từ nguyên mẫu được hoàn toàn bị mất, mặc dù thực tế rằng migration guide for 1.2 to 1.3 nói:

này thay đổi angular.copy để nó áp dụng nguyên mẫu của đối tượng ban đầu để các đối tượng sao chép. Trước đây, angular.copy sẽ sao chép các thuộc tính của chuỗi nguyên mẫu của đối tượng ban đầu trực tiếp lên đối tượng đã sao chép.

Làm cách nào để giữ các thuộc tính từ nguyên mẫu?

Trả lời

12

Trong khi bình luận trong commit linked to từ hướng dẫn chuyển đổi nói:

này thay đổi angular.copy để nó áp dụng nguyên mẫu của đối tượng gốc đến đối tượng sao chép.

điều này chỉ đúng khi đối số đích đến angular.copy(source, [destination]); không được cung cấp. Khi destination được cung cấp, chỉ các thuộc tính trực tiếp của đối tượng are copied.

Giải pháp là chỉ cung cấp các đối tượng source đến angular.copy chức năng, để lại ngoài khơi destination tham số:

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

Đối với bất cứ ai sử dụng Object.defineProperty và đọc bài viết này: Khách sạn cần phải được định nghĩa là đếm được : true cho nó xuất hiện trong đối tượng được sao chép. –

+0

Protip: cách dễ nhất để duy trì nguyên mẫu của 'Foo' khi sao chép là đi' angular.copy (Foo, Foo.prototype); '. – Bryce

+0

Điều này không trực tiếp trả lời câu hỏi, chỉ cung cấp lý do đằng sau vấn đề. – trysis

Các vấn đề liên quan