Tenho uma biblioteca com a seguinte adição para tipos de Array -
Array.prototype.top = function() {
return (this.length > 0) ? this[this.length-1] : null;
}
Parece ser aplicado a objetos não-Array - por exemplo,
for (key in myrecordset) {
alert(key); // will iterate and alert "top";
}
No console do depurador:
> myrecordset.length
< undefined
> typeof myrecordset
< 'object'
> myrecordset instanceof(Array)
< false
> myrecordset['top']
< f() {
return (this.length ...
}
Então, o que ? O objeto não é um array javascript (ou seja, sem comprimento, não é uma instância de, ...) mas o Array.prototype.top parece ter sido aplicado?
Nota: além disso, ao tentar seguir a cadeia de protótipos, obtenho
> myrecordset.constructor()
< {}
[[ Prototype ]]: Object
Há muitas maneiras de um objeto obter uma propriedade que é igual a
top
. A captura de tela prova quemyrecordset
tem umatop
propriedade que não é uma propriedade herdada, mas é uma propriedade "própria". Isso significa que foi copiado para lá.Aqui está um cenário possível que poderia ter acontecido:
Uma maneira de possivelmente evitar isso é definir
top
como uma propriedade não enumerável no protótipo do Array:Para estender adequadamente um protótipo, você deve tornar os novos props não enumeráveis. No seu caso, você pode estar interessado em uma correção que seja executada após incluir o código problemático, ela converterá todos os props enumeráveis em não enumeráveis: