如何在 JavaScript 中基于另一个对象动态创建属性和对象

How to create properties to and object dynamically based on another object in JavaScript?

本文关键字:创建 动态 属性 对象 一个对象 于另 JavaScript      更新时间:2023-09-26

我有一个场景,我需要从source对象创建一个新的result对象。

该对象需要具有 source 中的所有属性,并添加"方法",并根据要基于模板执行的属性和代码进行命名(在我的情况下alert(this.x))。

注意:脚本应考虑source中任意数量的属性

我想知道:

  • 是否可以在JS中执行此操作?
  • 什么是合适的工艺?
  • 有什么例子吗?

从源对象

  var source = {
        a: 'a',
        b: 'b'
    };

我需要获取动态创建的结果 OBJ(通过某个函数)

    var result = {
        a: 'a',
        b: 'b',
        _setA: function(){
            alert(this.a);
        },
        _setB: function(){
            alert(this.a);
        }
    }

注意:结果是在处理源对象后创建的

编辑:

根据您的答案最终解决方案

http://jsfiddle.net/kbnd6e5c/1/

可以先使用$.extend方法来复制属性,然后需要循环访问属性并创建动态资源库。例如,如下面的代码:

var source = { a: 'a', b: 'b' };    
var result = $.extend({}, source);
Object.keys(source).forEach(function(key) {
    result['_set' + key[0].toUpperCase() + key.slice(1)] = function(value) {
        alert(this.key);
        this[key] = value;
    }
});

查看下面的工作演示。

var source = { a: 'a', b: 'b', test: 'test' };    
var result = $.extend({}, source);
    
Object.keys(source).forEach(function(key) {
    result['_set' + key[0].toUpperCase() + key.slice(1)] = function(value) {
        this[key] = value;
    }
});
alert([ result.a, result.test ]);
result._setA('a1');
result._setTest('test1');
alert([ result.a, result.test ]);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

我不确定我是否完全理解您的问题,但我认为您应该使用这个简单的东西:

var copy = result
copy.example = {
    x: Y,
    z, T
}
copy.newFuntion = function(){...} //add your own function

这样你就拥有了结果所拥有的一切+你自己的东西

你可以做这样的事情:

var result = {
    a: 'A',
    b: 'B'
};
var copy = result;
Object.keys(result).forEach(function(key) {
    Object.defineProperty(copy, "_set" + key, {
        get: function() {
            return result[key]; 
        }
    })
});
copy._seta;
copy._setb;