如何查找方法是否属于 super 或 - Extending Array and Testing with ES6

How to find if a method belongs to super or - Extending Array and Testing with ES6

我是 ES6 中 OOP 的新手,正在尝试了解如何扩展数组以便创建管道。我从扩展 Array 广告覆盖 Array.filter 的简单案例开始,并期望 result.hasOwnProperty("filter") 成为 true... 但事实并非如此:

那么您如何测试方法筛选器现在是否位于 Wordlist 中 class?

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
  })
})

误解是关于 .hasOwnProperty() 的工作原理。 return 是一个布尔值,指示对象是否直接包含特定的 属性。在你的例子中,你正在为 class 定义一个 属性 ,它将新的 .filter() 属性 放在对象的原型上,这意味着 .filter() 属性 不是直接在对象上,而是继承自对象的原型.

因此,根据定义,当 属性 仅在原型上时,.hasOwnProperty() 将 return false.

如果你想看看result是否真的是一个Wordlist对象,那么你可以使用:

 result instanceof Wordlist   // should be true

对此进行测试。您也可以这样做:

 Object.getPrototypeOf(result).hasOwnProperty('filter')   // should be true

而且,要确保它与数组 .filter 不同,您可以检查一下:

result.filter !== [].filter   // should be false