www whatwg w3schools tutorial spec que coding javascript internet-explorer cross-browser getter getter-setter

javascript - whatwg - w3c or



Cross-browser Getter y Setter (4)

Esto funciona en Chrome / Firefox / Opera moderno pero falla en IE8. No lo he probado en IE9. ¿Cómo puedo hacer que este navegador sea compatible, incluido IE7 +? (Violín aquí.)

var foo = { get test(){ return ''Works''; } }; // foo.test should be ''Works''

He visto algo de uso con __defineGetter__ pero eso __defineGetter__ un error de ''método no reconocido'' en IE8.


Aquí está la workaround para IE6 / 7/8. ¡Realicé la prueba y funciona muy bien!

Actualización: el enlace está roto, puede ver el código de mis pruebas aquí:

// Super amazing, cross browser property function, based on http://thewikies.com/ function addProperty(obj, name, onGet, onSet) { // wrapper functions var oldValue = obj[name], getFn = function () { return onGet.apply(obj, [oldValue]); }, setFn = function (newValue) { return oldValue = onSet.apply(obj, [newValue]); }; // Modern browsers, IE9+, and IE8 (must be a DOM object), if (Object.defineProperty) { Object.defineProperty(obj, name, { get: getFn, set: setFn }); // Older Mozilla } else if (obj.__defineGetter__) { obj.__defineGetter__(name, getFn); obj.__defineSetter__(name, setFn); // IE6-7 // must be a real DOM object (to have attachEvent) and must be attached to document (for onpropertychange to fire) } else { var onPropertyChange = function (e) { if (event.propertyName == name) { // temporarily remove the event so it doesn''t fire again and create a loop obj.detachEvent("onpropertychange", onPropertyChange); // get the changed value, run it through the set function var newValue = setFn(obj[name]); // restore the get function obj[name] = getFn; obj[name].toString = getFn; // restore the event obj.attachEvent("onpropertychange", onPropertyChange); } }; obj[name] = getFn; obj[name].toString = getFn; obj.attachEvent("onpropertychange", onPropertyChange); } }


Hay un método "definePropery" que esencialmente le permitirá crear métodos de acceso (getters / setters) en Objetos sin la necesidad de invocar una llamada de función como setProp () / getProp ().

La sintaxis es un poco rara, pero he podido hacer que esto funcione en Firefox, Chrome, Safari e IE9.

Digamos que tengo un objeto JavaScript llamado "Persona".

function Person() { // set a default value // this.__name = ''John''; // add getter & setter methods // Object.defineProperty(this, "name", { get: function() { // additional getter logic return this.__name; }, set: function(val) { this.__name = val; // additional setter logic } }); } var p = new Person(); console.log(p.name); // ''John'' p.name = ''Stephen''; console.log(p.name); // ''Stephen''

Más información en el sitio de Mozilla here.


No creo que puedas.

En IE8 e inferior, el acceso a la propiedad es un mero acceso a la propiedad. No hay forma de ejecutar código de función sin invocar explícitamente la función.

Creo que en IE8 puede ser posible con elementos DOM, pero no creo que funcione para objetos nativos normales.


No se puede, la sintaxis no es compatible con los navegadores que no la implementaron. Va a pasar bastante tiempo antes de que puedas usar esa sintaxis sin tener problemas de CBC. Ser agradecido IE6 está prácticamente muerto en América del Norte.