克隆javascript中的不可枚举属性

Max*_*ddy 4 javascript

我在对象中有所有非可枚举的属性,我想克隆该对象.

我的问题是非可枚举的属性没有得到克隆.

以下为例

 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;
        }
    });
Run Code Online (Sandbox Code Playgroud)

例如,我在我的对象中有两个属性使用以下方法进行克隆,我的属性没有得到克隆我相信这是因为它们是不可枚举的.

   var newObject = $.extend({},oldObject);
   var newObject= Object.assign({},oldobject);
Run Code Online (Sandbox Code Playgroud)

如何在javascript中复制不可枚举的属性.

Mat*_*zer 7

如果一个或多个属性不可枚举,您想如何自动神奇地枚举它们?

既然你知道他们的名字,你应该这样做:

var sourceObj = this;
var targetObj = {};

["prop", "otherProperty"].forEach(function(property) {
    targetObj[property] = sourceObj[property]; 
});
Run Code Online (Sandbox Code Playgroud)

或者,只要定义了非可枚举属性,就可以构建整个属性名称数组:

   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]; 
});
Run Code Online (Sandbox Code Playgroud)

替代方法: Object.getOwnPropertyNames

Object.getOwnPropertyNames()方法返回直接在给定对象上找到的所有属性(可枚举或不可枚举)的数组.

也许这是最好的方法.Object.getOwnPropertyNames获取自己对象属性的名称,如果它们是可枚举的.也就是说,你可以避免构建整个propertyNames数组,这种方法应该没关系,因为你说所有的属性都是不可枚举的:

var sourceObj = this;
var targetObj = {};    

Object.getOwnPropertyNames(sourceObj).forEach(function(property) {
    targetObj[property] = sourceObj[property]; 
});
Run Code Online (Sandbox Code Playgroud)