我是 ES6 中的 OOP 新手,并試圖了解如何擴展 Array 以便我可以創建管道。我從一個擴展Arrayad overriding的簡單案例開始Array.filter,并期望......但它不是:result.hasOwnProperty("filter")true
那么如何測驗方法過濾器現在是否存在于 Wordlist 類中?
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
})
})
uj5u.com熱心網友回復:
誤解是關于如何.hasOwnProperty()作業的。這將回傳一個布林值,指示物件是否直接包含特定屬性。在您的情況下,您正在為將新屬性放在物件的原型上的類定義一個屬性,.filter()這意味著該.filter()屬性不是直接在物件上,而是從物件的原型繼承。
因此,根據定義,當屬性僅在原型上時,.hasOwnProperty()將回傳false.
如果您想查看是否result實際上是一個Wordlist物件,那么您可以使用:
result instanceof Wordlist // should be true
對此進行測驗。你也可以這樣做:
Object.getPrototypeOf(result).hasOwnProperty('filter') // should be true
而且,為了確保它與.filter陣列不同,您可以檢查一下:
result.filter !== [].filter // should be false
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/438723.html
標籤:javascript 单元测试 哎呀 ecmascript-6 es6级
上一篇:Python測驗對在另一個類中實體化為變數的類方法的呼叫
下一篇:使用Mockito跳過方法執行
