为对象中的所有属性设置javascript

时间:2018-06-29 15:47:23

标签: javascript getter-setter defineproperty

我正在尝试构建一种方法,该方法将自动在对象内的所有属性上创建get和set函数。理想情况下,当有人更新对象中的属性时,我想触发脏数据以在界面中更新。

问题::当遍历对象的属性时,最后一个属性的set函数似乎适用于所有以前的属性。我无法弄清楚为什么会发生这种情况,因为该属性在每个实例中显然都是唯一的(我已经基于原始属性名称创建了_prop版本)。

我用一些准系统代码创建了一个小提琴。 https://jsfiddle.net/rcmwxzvL/6/

这里是那些非提琴手的代码;此命令具有控制台命令,这些命令显示正在设置的_prop值。奇怪!

var superhero = {
        id: 0,
        firstname: 'Duck',
        lastname: 'Darkwing'
    };
    
    for (property in superhero)
    {
        var propertyName = property.toString();
    
        // Store initial value in '_var' before overwriting it with get/set
        this['_' + propertyName] = superhero[property];
    
        Object.defineProperty(superhero, propertyName, {
            set: function(value) {
                this['_' + propertyName] = value;
            },
            get: function() {
                return this['_' + propertyName];
            }
        });
    }
    console.log('--- Initial Value of test ---');
    console.log(superhero);
    console.log('-----------------------------');
    
    superhero.firstname = 'Kal';
    superhero.lastname = 'El';
    
    console.log (superhero.firstname + ' ' + superhero.lastname);

上一个控制台中的输出为:El El(应为Kal El

console.log(superhero);的输出:

firstname: "El"
id:(...)
lastname:(...)
_firstname:"Duck"
_id:0
_lastname:"El"
get firstname:ƒ ()
set firstname:ƒ (value)
get id:ƒ ()
set id:ƒ (value)
get lastname:ƒ ()
set lastname:ƒ (value)

我的最终目标是创建一个非常简单的库,该库可以自动将对象中的所有属性数据绑定到HTML接口元素。我已经编写了映射部分,由于上述问题,当直接访问对象内部的属性时,我只是无法获取接口进行更新。

谢谢;感谢社区可以提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

您需要更改

import gzip

def gzip_file(src_path, dst_path):
    with open(src_path, 'rb') as src, gzip.open(dst_path, 'wb') as dst:
        for chunk in iter(lambda: src.read(4096), b""):
            dst.write(chunk)

var propertyName = property.toString();

否则,每当您更新let propertyName = property.toString(); 时,它将更改所有属性,因为propertyName创建的作用域仅允许单个引用(功能作用域),而如果您使用var创建,每个循环步骤都会有自己的参考(块作用域)。

let