【问题标题】:How to retain prototype with angular.copy()?如何使用 angular.copy() 保留原型?
【发布时间】:2015-02-03 18:35:54
【问题描述】:

我正在使用 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.js 1.3.0+ 中,原型的属性完全丢失了,尽管migration guide for 1.2 to 1.3 说:

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

如何保留原型中的属性?

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    虽然迁移指南中 commit linked to 中的评论说:

    这会更改 angular.copy 以便它应用原始原型 对象到复制的对象。

    这仅在未提供 angular.copy(source, [destination]); 的目标参数时才成立。当提供destination 时,只有对象are copied 的直接属性。

    解决方案是只为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) if destination is undefined

    【讨论】:

    • 对于使用 Object.defineProperty 并阅读此内容的任何人:该属性需要定义为可枚举:为真,它才会出现在复制的对象中。
    • Protip:复制时维护Foo的原型最简单的方法是去angular.copy(Foo, Foo.prototype);
    • 这里不直接回答问题,只提供问题背后的推理。
    • 谢谢,@trysis。我更新了答案以明确给出解决方案。
    • 没问题。无论如何,这是一个很好的答案,只是建议了一种让它变得更好的方法。
    猜你喜欢
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 2019-11-08
    • 2021-11-05
    • 1970-01-01
    相关资源
    最近更新 更多