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

Joh*_*ann 8 javascript angularjs

我使用的是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+ 
Run Code Online (Sandbox Code Playgroud)

但是,在Angular.js 1.3.0+中,原型的属性完全丢失了,尽管1.2到1.3迁移指南说:

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

如何保留原型的属性?

Joh*_*ann 13

来自迁移指南的提交中的评论说:

这会更改,angular.copy以便将原始对象的原型应用于复制的对象.

仅当angular.copy(source, [destination]);未提供目标参数to时才会出现这种情况.当destination被提供,只有对象的直接属性被复制.

解决方案是只sourceangular.copy函数提供对象,而不是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"
Run Code Online (Sandbox Code Playgroud)

更新:这看起来仍然相关,因为angular.copy在v1.6.5中只调用getPrototypeOf(source) 目标未定义.

  • 对于使用Object.defineProperty并读取此内容的任何人:该属性需要定义为enumerable:true,以使其出现在复制的对象中. (2认同)