Javascript:如何通过 `=` 符号将 setter 分配给对象?
Javascript: how to assign setter to object via `=` sign?
有没有办法通过 =
符号将 setter/getter 分配给现有对象?
window.somesetter = set(v) {};
window.somesetter = function set(v) {};
window.somesetter = set settername(v) {};
试试这种形式:
window.somesetter = function (v) {};
没有,没有。
如果要将 setter 或 getter 分配给现有对象,请使用 defineProperty
。
Object.defineProperty(window, 'setter', {
set: function(value) { window.test = value }
});
window.setter = "Hello";
console.log(window.test);
我会说不。但如果您使用代理而不是对象本身,答案是 "kinda yes"。
但这是黑魔法,无论如何不推荐用于生产:)
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 分配给现有对象?
window.somesetter = set(v) {};
window.somesetter = function set(v) {};
window.somesetter = set settername(v) {};
试试这种形式:
window.somesetter = function (v) {};
没有,没有。
如果要将 setter 或 getter 分配给现有对象,请使用 defineProperty
。
Object.defineProperty(window, 'setter', {
set: function(value) { window.test = value }
});
window.setter = "Hello";
console.log(window.test);
我会说不。但如果您使用代理而不是对象本身,答案是 "kinda yes"。
但这是黑魔法,无论如何不推荐用于生产:)
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