我在玩对象,构造函数和类似的东西,我想知道是否有一种方法可以根据最初定义的方式将值绑定到变量。我有以下代码:
打字稿
let cr = "create",
ap = "apply",
$this = {
set: (prop, value) => {
this[prop] = value;
}
};
function creator() {
this.$ = (array: Object[]) => {
array.forEach((kp: Object) => {
let key = Object.keys(kp)[0];
let val = kp[Object.keys(kp)];
$this[key] = val;
creator.create(key, { value: val });
});
};
this.apply = (...objects: Object[]) => {
objects.forEach((obj: Object) => {
creator.call(obj);
});
};
}
function create(obj) {
function createValues(arr) {
let instance: Object = new obj();
let vals: any[] = [];
arr.forEach(name => {
vals.push(instance[name]);
});
return vals;
}
let names: string[] = Object.getOwnPropertyNames(new obj());
let values: string[] = createValues(names);
return combineArrays(names, values);
}
function combineArrays(arr1, arr2): { $?: any } { // the question mark removes an IDE error
let newObj: Object = {};
arr1.forEach(prop => {
newObj[prop] = arr2[arr1.indexOf(prop)];
});
return newObj;
}
Object.prototype.create = function(prop, options) {
return Object.defineProperty(this, prop, options);
};
create(creator).$([
{ hi: "hi" },
{ bye: $this["hi"] } // this is the important stuff
]);
我在想,如果有一种方法,内部set
的功能$this
变化,以检测它是如何被设定的,因此确定该值发生变化,所以它的价值应,如果让任何意义吗?假设您有以下内容:
let $this = {
set: function(prop, value) {
this[prop] = value;
}
}
let name = 'Ezra';
$this['name'] = name;
// then :
name = 'Bob';
// change $this.name too, so then:
console.log($this.name);
// >> 'Bob'
我相信这称为数据绑定,但我不确定如何在不产生大量代理的情况下进行操作。
您所描述的并不是真正的“数据绑定”,而是按引用传递。在您的示例中,您希望更新name
会反映在中$this['name']
。仅当您将变量的引用(或指针)传递给变量时,才有可能。
但是,在这种情况下,变量是string
,并且JavaScript中的字符串是不可变的:
没有任何字符串方法可以更改其操作的字符串,它们都将返回新的字符串。原因是字符串是不可变的–它们不能更改,我们只能制造新的字符串。
因此,请逐步完成您的示例:
这将创建一个名为“ Ezra”的新字符串,并分配一个名为的变量name
来引用该字符串。
let name = 'Ezra';
这将创建(或设置)在属性$this
叫做'name'
引用的字符串name
(这是'Ezra'
)。
$this['name'] = name;
这将创建一个名为的新字符串,'Bob'
并将其存储在名为的变量中name
。该变量已存在。这不会发生变异先前在那里举行的值。而是name
被更新为指向新的引用。
// then :
name = 'Bob';
但是,如果要传递一个对象,则会注意到您实际上可以对其进行突变。这是因为对象是通过引用传递的,并且您可以更改该引用处的值。
例如:
// Create a new value that stores an object, with a property 'firstName'
let name = { firstName: 'Ezra' };
// Assign myObject to $this['name']. Now $this['name'] and name both point to the same reference.
$this['name'] = name;
// Change the value in the object pointed-to by name
name.firstName = 'Bob'
console.log($this['name'].firstName); // <- This will output 'Bob'
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句