Soy nuevo en OOP en ES6 y trato de entender cómo extender Array para poder crear canalizaciones. Estoy comenzando con un caso simple de extender Array ad anulando Array.filter y esperando result.hasOwnProperty("filter") sea true ... pero no lo es:
Entonces, ¿cómo prueba que el filtro de método ahora vive en la clase Lista de palabras?
export class Wordlist extends Array{ constructor(...args){ super(...args) } filter(...args){ console.log("filtering") return super.filter(...args) } } // test describe.only('Wordlist.filter', ()=>{ it('should filter an array', ()=>{ const wordlist = new Wordlist('hello', 'rhubarb') const result = wordlist.filter(word => word === 'rhubarb') expect(result.length).toEqual(1) // pass expect(result).toEqual(["rhubarb"]) // pass expect(result.hasOwnProperty('filter')).toBe(true) // should pass but doesnt!!! expect(result.hasOwnProperty('reduce')).toBe(false) // passes }) })El malentendido es sobre cómo funciona .hasOwnProperty() . Esto devuelve un valor booleano que indica si un objeto contiene directamente una propiedad específica. En su caso, está definiendo una propiedad para la clase que coloca la nueva propiedad .filter() en el prototipo del objeto, lo que significa que la propiedad .filter() NO está directamente en el objeto, sino que se hereda del prototipo del objeto .
Entonces, por definición, cuando la propiedad está solo en el prototipo, .hasOwnProperty() devolverá false .
Si desea ver si el result es en realidad un objeto de lista de Wordlist , puede usar:
result instanceof Wordlist // should be truepara probar eso. También podrías hacer esto:
Object.getPrototypeOf(result).hasOwnProperty('filter') // should be true Y, para asegurarse de que no sea el mismo .filter que tiene una matriz, puede verificar esto:
result.filter !== [].filter // should be false