¿Cómo podemos establecer getter/setter personalizado en una variable global ya existente? Un enfoque directo falla:
var myVar; { let _myVar = myVar; delete myVar; Object.defineProperty(window, "myVar", { get() { return _myVar; }, set(val) { _myVar = val; } }); }var myVar;Según este documento :
Cualquier propiedad declarada con
varno se puede eliminar del ámbito global o del ámbito de una función.
Por lo tanto, no se aplicará delete myVar , y es por eso que no puede volver a establecer un valor para myVar con defineProperty .
Para una prueba simple, puede intentar registrar el valor de myVar después de delete myVar .
var myVar = 5; //set a value for `myVar` { let _myVar = myVar; delete myVar; //delete `myVar` console.log(myVar); //it's still 5 Object.defineProperty(window, "myVar", { get() { return _myVar; }, set(val) { _myVar = val; } }); } Para una posible solución, puede establecer explícitamente una propiedad en el objeto de la window que se considera una variable global.
window.myVar = 5; //set a value for `window.myVar` { let _myVar = window.myVar; delete window.myVar; console.log(window.myVar); //`undefined` as expected Object.defineProperty(window, "myVar", { get() { return _myVar; }, set(val) { _myVar = val; } }); } Solo una nota al margen que, en términos de uso de variables globales, var y window no son diferentes. Puede declarar window.myVar , pero puede usar myVar (sin window ) directamente.
window.myVar = 5; //set a value for `window.myVar` { let _myVar = myVar; delete window.myVar; console.log(window.myVar); //`undefined` as expected Object.defineProperty(window, "myVar", { get() { return _myVar; }, set(val) { _myVar = val; } }); console.log(myVar); //set it again with `defineProperty` }