你的位置:首页 > 软件开发 > Java > [Effective JavaScript 笔记]第40条:避免继承标准类

[Effective JavaScript 笔记]第40条:避免继承标准类

发布时间:2016-06-21 11:00:14
ECMAScript标准库里配备了许多重要的类,如Array,function,以及Date等。扩展这些类生成子类可以方便完成很多工作,但它们的定义具有很多特殊的行为,所以很难写出行为正确的类。Array示例一个操作文件系统的库可能希望创建一个对象的目录,该目录继承了数组的所有行 ...

[Effective JavaScript 笔记]第40条:避免继承标准类

ECMAScript标准库里配备了许多重要的类,如Array,function,以及Date等。扩展这些类生成子类可以方便完成很多工作,但它们的定义具有很多特殊的行为,所以很难写出行为正确的类。

Array示例

一个操作文件系统的库可能希望创建一个对象的目录,该目录继承了数组的所有行为。

function Dir(path,entries){ this.path=path; for(var i=0,n=entries.length;i < n;i++){  this[i]=entries[i]; }}Dir.prototype=Object.create(Array.prototype);

运行下面这段代码,并没有得到预期的行为。

var dir=new Dir('/tmp/mysite',['index.html','script.js','style.css']);dir.length;//0

失败的原因

length属性只对在内部被标记为“真正的”数组的特殊对象起作用。ECMAScript标准规定它是一个不可见的内部属性,称为[[Class]]。它的值只是一个简单的标签,并不是js真正有内部类系统。数组对象的[[Class]]值是"Array",函数对应的[[Class]]是"Function"。下面这个表是ECMAScript中定义的完整的[[Class]]属性值集合。

[Effective JavaScript 笔记]第40条:避免继承标准类

解密length

那么神奇的[[Class]]属性对length做了什么呢?事实上,length的行为只被定义在内部属性[[Class]]的值为"Array"的特殊对象中。对于这些对象,js保持length属性与该对象的索引属性的数量同步。如果给该对象添加了更多的索引属性,length属性会自动增加。如果减少了length属性,也会自动删除任何索引大于该新值的索引属性。

原标题:[Effective JavaScript 笔记]第40条:避免继承标准类

关键词:JavaScript

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。