看了很多讲解JS的书,个人觉得还是这本讲的生动易解,特别是在“面向对象编程”这章讲的更是“惟妙惟肖”。这本书由世界顶级JavaScript程序员Marijn Haverbeke撰写“Eloquent JavaScript”翻译而来。有兴趣看英文原版的,文章后参考链接有标示。
我们知道,对于对象的属性操作要考虑各方面问题,比如在枚举属性的时候要考虑是否属于当前对象,是否可枚举,如果原型中的hasOwnProperty方法被属性覆盖了怎么办……
书中为我们准备好了操作对象属性的这一“词典”(Dictionary
):
//遍历对象属性 function forEachIn(object, action) { for (var property in object) { if (Object.prototype.hasOwnProperty.call(object, property)) action(property, object[property]); } } //Dictionary 词典 function Dictionary(startValues) { this.values = startValues || {}; } Dictionary.prototype.store = function(name, value) {//添加属性 this.values[name] = value; }; Dictionary.prototype.lookup = function(name) { //查找属性值 return this.values[name]; }; Dictionary.prototype.contains = function(name) { //检测是否包含某属性 return Object.prototype.hasOwnProperty.call(this.values, name) && Object.prototype.propertyIsEnumerable.call(this.values, name); }; Dictionary.prototype.each = function(action) { //遍历属性 forEachIn(this.values, action); }; //实例 eg. var colours = new Dictionary({Grover: "blue", Elmo: "orange", Bert: "yellow"}); show(colours.contains("Grover")); show(colours.contains("constructor")); colours.each(function(name, colour) { print(name, " is ", colour); });
如果仔细阅读这段代码,会觉得“词典”写得有多巧妙了。综合考虑了如上提出的各方面问题。
【参考】