Javascript 复制具有getter结果的对象
我有一个包含getter的对象Javascript 复制具有getter结果的对象,javascript,getter-setter,Javascript,Getter Setter,我有一个包含getter的对象 myObject { id: "MyId", get title () { return myRepository.title; } } myRepository.title = "MyTitle"; 我想获得一个对象,如: myResult = { id: "MyId", title: "MyTitle" } 我不想复制getter,因此: myResult.title; //
myObject {
id: "MyId",
get title () { return myRepository.title; }
}
myRepository.title = "MyTitle";
我想获得一个对象,如:
myResult = {
id: "MyId",
title: "MyTitle"
}
我不想复制getter,因此:
myResult.title; // Returns "MyTitle"
myRepository.title = "Another title";
myResult.title; // Should still return "MyTitle"
我试过:
- $.extend():但它不会在getter上迭代李>
- 按建议迭代属性,但不迭代getter
- 正如我所建议的那样,使用angular.forEach。但我只获取属性,而不获取getter
"title": { get: function () { return myRepository.title; }},
从文件中可以看出:
可枚举当且仅当此属性在
对应对象上属性的枚举。默认为
错
设置enumerable:true可修复此问题
"title": { get: function () { return myRepository.title; }, enumerable: true },
$.extend
正是您想要的。(更新:您已经说过您也需要不可枚举的属性,因此它不能满足您的需要;请参阅下面回答的第二部分,但我将第一部分留给其他人。)错误并不是说生成的对象没有标题
属性,这意味着生成的对象的title
属性将不是getter,它非常适合您所说的需要
具有正确getter语法的示例:
//myRepository对象
var myRepository={title:“MyTitle”};
//具有getter的对象
变量myObject={
id:“MyId”,
获取标题(){return myRepository.title;}
};
//具有普通属性的副本
var copy=$.extend({},myObject);
//查看副本(尽管实际上,结果看起来
//(两种方式都一样)
log(JSON.stringify(copy));
//证明副本的“标题”实际上只是一个普通属性:
snippet.log(“Before:copy.title=“+copy.title”);
copy.title=“foo”;
snippet.log(“之后:copy.title=“+copy.title”)代码>
首先,修复语法,尽管它在实际代码中可能很好:
myObject = {
id: "MyId",
get title () { return myRepository.title; }
}
现在,回答如下:)
您只需在
循环中使用for..获取所有属性,然后将它们保存为:
var newObj = {};
for (var i in myObject) {
newObj[i] = myObject[i];
}
不需要jQuery、Angular和任何其他插件 很抱歉,您的对象是语法错误。您需要删除
:在get
关键字之后的function
;而且您不能有一个普通的title
属性和一个同名的getter。$.extend
工作得很好。错误描述说“jQuery.extend复制属性getter返回值,而不是它们的代码。”-然而,这正是您想要的。使用中的手动执行同样的操作。抱歉@Bergi,对象sintax只是该对象的console.log的副本。我要更新这个问题。谢谢!我已经更新了这个问题。问题是,如果property.enumerable=false,$.extend不能与getter一起工作@MarioLevrero:没错,它们也不会像Scimonter那样出现在循环中。如果您想了解不可枚举属性,您需要使用。@MarioLevrero:我已经更新了答案,以演示如何使用getOwnPropertyNames
(好的,其中一种方法)。是的,谢谢您的更新。我没有注意到默认可枚举属性为false。@MarioLevrero:当我第一次了解defineProperty
.Thx时,我也对此感到惊讶!我已经更新了这个问题。问题是,如果property.enumerable=false,for(…)不适用于getter;