Effective JavaScript Item 47 绝不要向Object.prototype中添加可列举的(Enumerable)属性
来源:互联网 发布:安与知耻 编辑:程序博客网 时间:2024/06/05 06:26
本系列作为Effective JavaScript的读书笔记。
如果你的代码中依赖于for..in循环来遍历Object类型中的属性的话,不要向Object.prototype中添加任何可列举的属性。
但是在对JavaScript执行环境进行增强的时候,往往都需要向Object.prototype对象添加新的属性或者方法。比如可以添加一个方法用于得到某个对象中的所有的属性名:
Object.prototype.allKeys = function() {var result = [];for (var key in this) {result.push(key);}return result;};
但是结果是下面这个样子的:
({ a: 1, b: 2, c: 3}).allKeys(); // ["allKeys", "a", "b","c"]
一个可行的解决方案是使用函数而不是在Object.prototype上定义新的方法:
function allKeys(obj) {var result = [];for (var key in obj) {result.push(key);}return result;}
但是如果你确实需要向Object.prototype上添加新的属性,同时也不希望该属性在for..in循环中被遍历到,那么可以利用ES5环境提供的Object.defineProject方法:
Object.defineProperty(Object.prototype, "allKeys", {value: function() {var result = [];for (var key in this) {result.push(key);}return result;},writable: true,enumerable: false,configurable: true});
以上代码的关键部分就是将enumerable属性设置为false。这样的话,在for..in循环中就无法遍历该属性了。
总结:
- 避免向Object.prototype中添加任何属性。
- 如果确实有必要向Object.prototype中添加方法属性,可以考虑使用独立函数替代。
- 使用Object.defineProperty来添加可以不被for..in循环遍历到的属性。
0 0
- Effective JavaScript Item 47 绝不要向Object.prototype中添加可列举的(Enumerable)属性
- Effective JavaScript Item 39 绝不要重用父类型中的属性名
- JavaScript中Object 对象的Prototype属性
- Effective JavaScript Item 32 绝不要修改__proto__
- js Object的属性 Configurable,Enumerable,Writable,Value,Getter,Setter
- JavaScript中prototype属性
- Effective JavaScript Item 30 理解prototype, getPrototypeOf和__proto__的不同
- javascript中Object.prototype.toString
- JavaScript中对象的prototype属性
- javascript中对象的prototype属性
- javascript中prototype属性的应用
- Effective JavaScript Item 34 在prototype上保存方法
- javascript添加页面item属性
- 读书笔记 effective c++ Item 9 绝不要在构造函数或者析构函数中调用虚函数
- 读书笔记 effective c++ Item 9 绝不要在构造函数或者析构函数中调用虚函数
- 读书笔记 effective c++ Item 9 绝不要在构造函数或者析构函数中调用虚函数
- 读书笔记 effective c++ Item 9 绝不要在构造函数或者析构函数中调用虚函数
- javascript的prototype属性
- 移动平台WEB前端开发技巧汇总
- MyBatis一对一关系映射:根据班级id查询班级信息并查出辅导员的信息
- void (*f(int, void (*)(int)))(int) 函数解析
- 由一对多引谈Hibernate的inverse="true"属性
- Axure RP 7.0注册码
- Effective JavaScript Item 47 绝不要向Object.prototype中添加可列举的(Enumerable)属性
- 单元测试中mock的使用及mock神器jmockit实践
- CopyOnWriteArrayList(1)
- 移动终端web开发必备知识
- mysql联合索引经典实例与解析
- 关于"栈"对象弱引用的线程安全问题
- android四种数据存储及示例
- Linux waitpid用WNOHANG
- Hibernate 对象的三种状态