ECMAScript标准库里配备了许多重要的类,如Array,function,以及Date等。扩展这些类生成子类可以方便完成很多工作,但它们的定义具有很多特殊的行为,所以很难写出行为正确的类。Array示例一个操作文件系统的库可能希望创建一个对象的目录,该目录继承了数组的所有行 ...
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]]属性值集合。
解密length
那么神奇的[[Class]]属性对length做了什么呢?事实上,length的行为只被定义在内部属性[[Class]]的值为"Array"的特殊对象中。对于这些对象,js保持length属性与该对象的索引属性的数量同步。如果给该对象添加了更多的索引属性,length属性会自动增加。如果减少了length属性,也会自动删除任何索引大于该新值的索引属性。
原标题:[Effective JavaScript 笔记]第40条:避免继承标准类
关键词:JavaScript
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。