javascript - Copy object with results of getters -
i have object contains getter.
myobject { id: "myid", title () { return myrepository.title; } } myrepository.title = "mytitle"; i want obtain object like:
myresult = { id: "myid", title: "mytitle" } i don't want copy getter, so:
myresult.title; // returns "mytitle" myrepository.title = "another title"; myresult.title; // should still return "mytitle" i've try:
- $.extend(): doesn't iterate on getters. http://bugs.jquery.com/ticket/6145
- iterating properties suggested here, doesn't iterate on getters.
- as i'm using angular, using angular.foreach, suggested here. properties , not getters.
any idea? thx!
update setting getter using object.defineproperty as:
"title": { get: function () { return myrepository.title; }}, as can read in doc:
enumerable true if , if property shows during enumeration of properties on corresponding object. defaults false.
setting enumerable: true fix problem.
"title": { get: function () { return myrepository.title; }, enumerable: true },
(update: you've since said want non-enumerable properties well, doesn't want; see second part of answer below, i'll leave first bit others.) bug isn't saying resulting object won't have $.extend want.title property, it's saying resulting object's title property won't getter, perfect said wanted.
example correct getter syntax:
// myrepository object var myrepository = { title: "mytitle" }; // object getter var myobject = { id: "myid", title() { return myrepository.title; } }; // copy plain property var copy = $.extend({}, myobject); // view copy (although actually, result // same either way) snippet.log(json.stringify(copy)); // prove copy's `title` plain property: snippet.log("before: copy.title = " + copy.title); copy.title = "foo"; snippet.log("after: copy.title = " + copy.title); <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <!-- script provides `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> <script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script> syntax fixes:
added missing
var,=, ,;removed duplicate property
titlecorrected getter declaration syntax
if want include non-enumerable properties, you'll need use object.getownpropertynames because won't show in for-in loop, object.keys, or $.extend (whether or not they're "getter" or normal properties):
// myrepository object var myrepository = { title: "mytitle" }; // object getter var myobject = { id: "myid" }; object.defineproperty(myobject, "title", { enumerable: false, // it's default, emphasis, get: function() { return myrepository.title; } }); snippet.log("$.extend won't visit non-enumerable properties, id here:"); snippet.log(json.stringify($.extend({}, myobject))); // copy var copy = object.getownpropertynames(myobject).reduce(function(result, name) { result[name] = myobject[name]; return result; }, {}); // view copy (although actually, result // same either way) snippet.log("our copy operation object.getownpropertynames does, though:"); snippet.log(json.stringify(copy)); // prove copy's `title` plain property: snippet.log("before: copy.title = " + copy.title); copy.title = "foo"; snippet.log("after: copy.title = " + copy.title); <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <!-- script provides `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> <script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
Comments
Post a Comment