如何查找方法是否属于 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
我是 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