[英]Inherited non-enumerable properties in for…in loop (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.defineProperties
和Object.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.