Quiero agregar un método (no una propiedad) a Array.prototype, pero no quiero que sea enumerable y arruine todo (... en...) en bibliotecas de terceros.
//... Example: //... Only push the value if it is not false Array.prototype.pushValue = function(value){ if(value){ this.push(value); } } var pieces = []; pieces.pushValue(0); pieces.pushValue(1); pieces.pushValue(2); pieces.pushValue(null); console.log(pieces.join(",")); //outputs 1,2 for(var k in pieces){ console.log(k); //outputs 0,1 and pushValue }Sé que puedo usar "hasOwnProperty" en mi código para detectar mis métodos personalizados, pero no puedo cambiar todo el código de bibliotecas de terceros para agregar esta verificación.
Independientemente de si es una buena práctica o no agregar un método a Array.prototype, ¿es posible agregarlo como no enumerable?
Puedes usar Object.defineProperty() así:
Object.defineProperty(Array.prototype, 'test', { value: () => console.log(1), enumerable: false, });Este método permite una adición o modificación precisa de una propiedad en un objeto. La adición normal de propiedades a través de la asignación crea propiedades que se muestran durante la enumeración de propiedades (for...in loop o método Object.keys), cuyos valores se pueden cambiar y que se pueden eliminar. Este método permite cambiar estos detalles adicionales de sus valores predeterminados. De forma predeterminada, los valores agregados mediante Object.defineProperty() son inmutables y no enumerables.