簡體   English   中英

在javascript中克隆不可枚舉的屬性

[英]Cloning Non enumerable properties in 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;
        }
    });

例如,我的對象中有以上兩個屬性使用以下方法進行克隆,我的屬性沒有被克隆我相信這是因為它們是不可枚舉的。

   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]; 
});

替代方法: Object.getOwnPropertyNames

Object.getOwnPropertyNames()方法返回直接在給定對象上找到的所有屬性(可枚舉或不可枚舉Object.getOwnPropertyNames()的數組。

也許這是最好的方法。 Object.getOwnPropertyNames獲取自己對象的屬性的名稱,無論它們是否可枚舉。 也就是說,您可以避免構建整個propertyNames數組,這種方法應該對您沒問題,因為您說過所有屬性都不可枚舉

var sourceObj = this;
var targetObj = {};    

Object.getOwnPropertyNames(sourceObj).forEach(function(property) {
    targetObj[property] = sourceObj[property]; 
});

您可以使用Object.definePropertiesObject.getOwnPropertyDescriptors()函數

Object.defineProperties()方法直接在對象上定義新屬性或修改現有屬性,返回該對象。

Object.getOwnPropertyDescriptors()方法返回給定對象的所有屬性描述符。

因此,您可以將原始對象的屬性添加到一個空對象中,如下所示

var source_obj = this
var cloned_obj = Object.defineProperties({}, Object.getOwnPropertyDescriptors(source_obj));

我在如何在 JavaScript 中實現 Ruby 的擴展模塊中有一個類似的問題。

而且因為我不想使用迭代將每個方法附加到新對象,所以我能做的最后最好的方法就是這樣,歡迎給我任何想法和建議,謝謝。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM