有没有办法通过=
标志将setter / getter分配给现有对象?
window.somesetter = set(v) {};
window.somesetter = function set(v) {};
window.somesetter = set settername(v) {};
我会说不。但如果您使用代理而不是对象本身,答案是“有点是”。
但这是黑魔法,并不建议生产:)
const winProxy = new Proxy(window, {
set(target, name, value) {
if (typeof value === 'function' && {set: 1, get: 1}[value.name]) {
const descriptor = Reflect.getOwnPropertyDescriptor(target, name) || {
enumerable: false,
configurable: true,
}
descriptor[value.name] = value
Reflect.defineProperty(target, name, descriptor)
} else {
Reflect.set(target, name, value)
}
}
})
winProxy.someProp = function set(v) {
console.log('setter', v);
}
winProxy.someProp = function get() {
console.log('getter')
}
window.someProp = 1;
window.someProp
不,没有。
如果要将setter或getter分配给现有对象,请使用defineProperty
。
Object.defineProperty(window, 'setter', {
set: function(value) { window.test = value }
});
window.setter = "Hello";
console.log(window.test);
试试这个表格:
window.somesetter = function (v) {};