赞
踩
最近发现javascript的JSON对象没有forEach这个方法,所以就自己动手扩展了一下,做个记录,方便以后使用。
· 最初的代码
if (!Object.prototype.forEach) {
Object.prototype.forEach = function(fn) {
try {
for (var key in this) {
fn.call(this, this[key], key, this);
}
} catch (e) {
throw new TypeError();
}
}
}
· 测试
var obj = {"a": 1,"b": 2};
obj.forEach(function(value, key, json){
console.log(value, key, json);
/*
打印结果:
1 "a" Object {a: 1, b: 2}
2 "b" Object {a: 1, b: 2}
function (fn) {
try {
for (var key in this) {
fn.call(this, this[key], key, this);
}
} catch (e) {
throw new TypeError();
}
} "forEach" Object {a: 1, b: 2}
*/
})
· 分析
以上测试结果,基本符合预期,不过有一个问题:在自定义方法的最后,把方法函数体本身也枚举出来了。为了解决这一问题,可以采用一个折中的办法:hasOwnProperty(),即确定某属性是否是对象本身的属性。
· 最终版(支持IE6+)
// @support: IE6+, Firefox, Chrome
if (!Object.prototype.forEach) {
Object.prototype.forEach = function(fn) {
try {
for (var key in this) {
if (this.hasOwnProperty(key)) {
fn.call(this, this[key], key, this);
}
}
} catch (e) {
throw new TypeError();
}
}
}
· 测试
var obj = {"a": 1,"b": 2};
obj.forEach(function(value, key, json){
console.log(value, key, json);
/*
打印结果:
1 "a" Object {a: 1, b: 2}
2 "b" Object {a: 1, b: 2}
*/
}
然后结果完全符合预期了,Oh,Yeah ! 但是对于处女座,你以为就酱紫结束了吗?NO NO NO.
So, 请接着往下看
在新版本的ECMAScript 5中,可以设置自定义对象的方法为不可枚举。支持IE9以上,具体设置如下:
// @support: IE9+, Firefox, Chrome
if (!Object.prototype.forEach) {
Object.prototype.forEach = function(fn) {
try {
for (var key in this) {
fn.call(this, this[key], key, this);
}
} catch (e) {
throw new TypeError();
}
}
}
/***************************************************/
try {
Object.defineProperty(Object.prototype, "forEach", {
enumerable: false //是否可枚举?false
});
} catch (e) {
//throw new TypeError();
console.log(e);
}
· 测试
var obj = {"a": 1,"b": 2};
obj.forEach(function(value, key, json){
console.log(value, key, json);
/**
* 打印结果:
* 1 "a" Object {a: 1, b: 2}
* 2 "b" Object {a: 1, b: 2}
*/
}
以上就是全文,欢迎留言。同时感谢@jslang(天际的海浪)的指点。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。