İstemci tarayıcıları ile büyük bir uyumluluk gerektiren üretim kodu için, Ivan Nevostruev'in yukarıdaki Object.keys
eski tarayıcılarda emin olmak için şim ile cevabını hala öneriyorum . Ancak ECMA'nın yeni defineProperty
özelliğini kullanarak istenen işlevselliği tam olarak elde etmek mümkündür .
ECMAScript 5 itibarıyla - Object.defineProperty
ECMA5'ten itibaren Object.defineProperty()
numaralandırılamayan özellikleri tanımlamak için kullanabilirsiniz . Geçerli uyumluluk hala çok arzulanan vardır, ancak bu sonuçta tüm tarayıcılarda kullanılabilir haline gelmelidir. (Özellikle IE8 ile mevcut uyumsuzluğa dikkat edin!)
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"]
Bununla birlikte, ECMA5 zaten eklendiğinden, Object.keys
şunları da kullanabilirsiniz:
Object.defineProperty(Object.prototype, 'keys', {
value: function keys() {
return Object.keys(this);
},
enumerable: false
});
Orijinal cevap
Object.prototype.keys = function ()
{
var keys = [];
for(var i in this) if (this.hasOwnProperty(i))
{
keys.push(i);
}
return keys;
}
Düzenleme: Bu yanıt bir süredir olduğu için yukarıdakileri el değmeden bırakacağım. Bunu okuyan herkes, Ivan Nevostruev'in aşağıdaki cevabını da okumalıdır.
Prototip işlevlerini numaralandırmanın bir yolu yoktur, bu da onları her zaman kullanmayan in-in döngülerinde ortaya çıkarır hasOwnProperty
. Object'in prototipini genişletmek o kadar dağınık olmasa bile bu cevabın ideal olacağını düşünüyorum.