Para código de produção que requer uma grande compatibilidade com navegadores clientes, ainda sugiro a resposta de Ivan Nevostruev acima com shim para garantir Object.keys
em navegadores mais antigos. No entanto, é possível obter a funcionalidade exata solicitada usando o novo defineProperty
recurso da ECMA .
No ECMAScript 5 - Object.defineProperty
No ECMA5, você pode usar Object.defineProperty()
para definir propriedades não enumeráveis. A compatibilidade atual ainda tem muito a desejar, mas isso deve se tornar utilizável em todos os navegadores. (Observe especificamente a incompatibilidade atual com o IE8!)
Object.defineProperty(Object.prototype, 'keys', {
value: function keys() {
var keys = [];
for(var i in this) if (this.hasOwnProperty(i)) {
keys.push(i);
}
return keys;
},
enumerable: false
});
var o = {
'a': 1,
'b': 2
}
for (var k in o) {
console.log(k, o[k])
}
console.log(o.keys())
# OUTPUT
# > a 1
# > b 2
# > ["a", "b"]
No entanto, como o ECMA5 já foi adicionado, Object.keys
você também pode usar:
Object.defineProperty(Object.prototype, 'keys', {
value: function keys() {
return Object.keys(this);
},
enumerable: false
});
Resposta original
Object.prototype.keys = function ()
{
var keys = [];
for(var i in this) if (this.hasOwnProperty(i))
{
keys.push(i);
}
return keys;
}
Edit: Uma vez que esta resposta existe há algum tempo, deixarei o acima exposto intocado. Quem estiver lendo isso também deve ler a resposta de Ivan Nevostruev abaixo.
Não há como tornar as funções de protótipo não enumeráveis, o que as leva a sempre aparecer em loops for-in que não são usados hasOwnProperty
. Ainda acho que essa resposta seria ideal se estender o protótipo de Object não fosse tão complicado.