Effective JavaScript Item 32 绝不要修改__proto__
2014-09-30 10:08
169 查看
本系列作为Effective JavaScript的读书笔记。
和Object.getPrototypeOf相比,__proto__的特殊之处还体现在它能够修改一个对象的原型继承链。因为它是一个属性,除了执行获取它的操作外,还能够对它进行设置。
但是,绝不要修改__proto__。原因如下:
首先,最显而易见的原因就是便携性。因为不是所有的JavaScript执行环境都支持这一属性,所以使用了__proto__之后,代码就不能在那些不支持__proto__的环境中运行了。
其次,是性能上的考虑。现在的JavaScript引擎的实现都会针对对象属性的存取作出大量的优化,因为这些操作是最常用的。当修改了对象的__proto__后,就相当于修改了对象的整个继承结构,这样做回导致很多优化都不再可用。
最后,最重要的原因是需要保证程序的可靠性。因为改变__proto__属性后,对象的原型继承链也许会被完全地改变。当程序中有其他代码依赖于原来的继承链时,就会出现不可意料的错误。通常而言,原型继承链需要保持稳定。
当需要为一个新创建的对象赋予一个原型对象时,可以使用ES5提供的Object.create方法。对于未实现ES5标准的环境,可以参考Item
33,它给出来一个不依赖于__proto__的Object.create方法的实现。
总结:
绝不要修改对象的__proto__属性。
当需要为新建对象提供一个原型对象时,可以考虑使用Object.create。
和Object.getPrototypeOf相比,__proto__的特殊之处还体现在它能够修改一个对象的原型继承链。因为它是一个属性,除了执行获取它的操作外,还能够对它进行设置。
但是,绝不要修改__proto__。原因如下:
首先,最显而易见的原因就是便携性。因为不是所有的JavaScript执行环境都支持这一属性,所以使用了__proto__之后,代码就不能在那些不支持__proto__的环境中运行了。
其次,是性能上的考虑。现在的JavaScript引擎的实现都会针对对象属性的存取作出大量的优化,因为这些操作是最常用的。当修改了对象的__proto__后,就相当于修改了对象的整个继承结构,这样做回导致很多优化都不再可用。
最后,最重要的原因是需要保证程序的可靠性。因为改变__proto__属性后,对象的原型继承链也许会被完全地改变。当程序中有其他代码依赖于原来的继承链时,就会出现不可意料的错误。通常而言,原型继承链需要保持稳定。
当需要为一个新创建的对象赋予一个原型对象时,可以使用ES5提供的Object.create方法。对于未实现ES5标准的环境,可以参考Item
33,它给出来一个不依赖于__proto__的Object.create方法的实现。
总结:
绝不要修改对象的__proto__属性。
当需要为新建对象提供一个原型对象时,可以考虑使用Object.create。
相关文章推荐
- Effective JavaScript Item 23 永远不要修改arguments对象
- [Effective JavaScript 笔记]第32条:始终不要修改__proto__属性
- C4 - Item 32 永远不要修改__proto__
- Effective JavaScript Item 39 绝不要重用父类型中的属性名
- [Effective JavaScript 笔记]第31条:使用Object.getPrototypeOf函数而不要使用__proto__属性
- Effective JavaScript Item 30 理解prototype, getPrototypeOf和__proto__的不同
- Effective JavaScript Item 61 不要阻塞事件队列
- Effective JavaScript Item 31 优先使用Object.getPrototypeOf,而不是__proto__
- Effective JavaScript Item 30 理解prototype, getPrototypeOf和__proto__的不同
- [Effective JavaScript 笔记]第23条:永远不要修改arguments对象
- Effective JavaScript Item 47 绝不要向Object.prototype中添加可列举的(Enumerable)属性
- Effective JavaScript Item 31 优先使用Object.getPrototypeOf,而不是__proto__
- Effective JavaScript Item 28 不要依赖函数的toString方法
- effective C++笔记之条款31、32: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针所指对象的引用、尽可能地推迟变量的定义
- Effective JavaScript Item 22 使用arguments来创建接受可变参数列表的函数
- Effective JavaScript Item 19 使用高阶函数 (High-Order Function)
- Effective JavaScript Item 24 使用一个变量来保存arguments的引用
- Effective JavaScript Item 10 避免使用with
- Item 32: Program in the future tense.(More Effective C++)
- Effective JavaScript Item 27 使用闭包而不是字符串来封装代码