Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.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中克隆不可枚举属性_Javascript - Fatal编程技术网

在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));