如何使用angular.copy()保留原型

How to retain prototype with angular.copy()?

本文关键字:保留 原型 copy 何使用 angular      更新时间:2023-09-26

我使用的是Angular.js 1.3.x。在Angular的早期版本(包括1.3.0-beta5)中,以下代码会将属性从原型直接复制到新对象:

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+ 

然而,在Angular.js1.3.0+中,原型的属性完全丢失,尽管1.2到1.3的迁移指南中说:

这将更改angular.copy,以便将原始对象的原型应用于复制的对象。以前,angular.copy会将原始对象的原型链的属性直接复制到复制的对象上。

如何从原型中保留属性?

虽然迁移指南中链接到的提交中的注释说:

这将更改angular.copy,使其应用原始的原型对象到复制的对象。

只有当没有提供CCD_ 2的目的地参数时,这才是真的。当提供destination时,仅复制对象的直接属性。

解决方案是只向angular.copy函数提供source对象,而不提供destination参数:

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"

更新:这似乎仍然相关,因为v1.6.5中的angular.copy仅在未定义目标时调用getPrototypeOf(source)