Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 复制具有getter结果的对象_Javascript_Getter Setter - Fatal编程技术网

Javascript 复制具有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; //

我有一个包含getter的对象

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
有什么想法吗?谢谢

更新 我使用Object.defineProperty将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;