我正在尝试构建一种方法,该方法将自动在对象内的所有属性上创建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接口元素。我已经编写了映射部分,由于上述问题,当直接访问对象内部的属性时,我只是无法获取接口进行更新。
谢谢;感谢社区可以提供的任何帮助。
答案 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