在javascript中克隆不可枚举属性
我在对象中有所有不可枚举的属性,我想克隆那个对象 我的问题是无法克隆不可枚举属性 以下面的例子为例在javascript中克隆不可枚举属性,javascript,Javascript,我在对象中有所有不可枚举的属性,我想克隆那个对象 我的问题是无法克隆不可枚举属性 以下面的例子为例 Object.defineProperty(this, 'prop', { get: function () { return prop; }, set: function (value) { prop= value; } }); Object.defineProper
Object.defineProperty(this, 'prop', {
get: function () {
return prop;
},
set: function (value) {
prop= value;
}
});
Object.defineProperty(this, 'newprop', {
get: function () {
return newprop;
},
set: function (value) {
newprop= value;
}
});
例如,我在使用以下方法进行克隆的对象中有上述两个属性,我的属性没有被克隆,我相信这是因为它们是不可枚举的
var newObject = $.extend({},oldObject);
var newObject= Object.assign({},oldobject);
如何在javascript中复制不可枚举的属性。如果一个或多个属性不可枚举,您希望如何神奇地自动枚举它们 既然你知道他们的名字,你应该这样做:
var sourceObj = this;
var targetObj = {};
["prop", "otherProperty"].forEach(function(property) {
targetObj[property] = sourceObj[property];
});
或者,您可以在定义不可枚举属性时构建整个属性名称数组:
var propertyNames = [];
Object.defineProperty(this, 'newprop', {
get: function () {
return newprop;
},
set: function (value) {
newprop= value;
}
});
propertyNames.push("newprop"); // <---
Object.defineProperty(this, 'newprop2', {
get: function () {
return newprop;
},
set: function (value) {
newprop= value;
}
});
propertyNames.push("newprop2"); // <---
propertyNames.forEach(function(property) {
targetObj[property] = sourceObj[property];
});
我有一个类似的问题 因为我不想使用iterate将每个方法附加到新对象,所以我能做的最后一个最好的方法就是这样,欢迎给我任何想法和建议,谢谢
class Test {
constructor(name) {
this.name = name;
}
test1(){
return this.name + "test1"
}
}
const Other = {
test2: function(){
return this.name + "test2"
},
test3: function(){
return this.name + "test3"
},
test4: function(){
return this.name + "test4"
}
}
var person = new Test("HKE")
Object.assign(person,Other) //this like object.extend(Module) in ruby
console.log(person.test1()) // HKEtest1
console.log(person.test2()) // HKEtest2
console.log(person.test3()) // HKEtest3
console.log(person.test4()) // HKEtest4
var house = new Test("Tsao")
console.log(house.test1())
console.log(house.test2()) // TypeError: house.test2 is not a function
console.log(house.test3()) // TypeError: house.test3 is not a function
console.log(house.test4()) // TypeError: house.test4 is not a function
您可以使用
Object.defineProperties
和Object.getOwnPropertyDescriptors()
函数
Object.defineProperties()
方法直接在对象上定义新属性或修改现有属性,并返回该对象
Object.getOwnPropertyDescriptors()
方法返回给定对象的所有自己的属性描述符
因此,可以将原始对象的属性添加到空对象中,如下所示
var source_obj = this
var cloned_obj = Object.defineProperties({}, Object.getOwnPropertyDescriptors(source_obj));
很抱歉把你弄糊涂了,我有一个对象是所有不可枚举的properties@MaxMaddy这不会改变答案,是吗?@maxmady用另一种方法查看我的更新;谢谢,“替代方法”应该是这里唯一的解决方案。第一个解决方案是糟糕的做法!
var source_obj = this
var cloned_obj = Object.defineProperties({}, Object.getOwnPropertyDescriptors(source_obj));