正如上次所述,,出于效率考虑,我们应该尽可能的将一些可重用的属性和方法添加到原型中去。
如果养成了这个好习惯,我们仅仅依靠原型就能顺利的完成继承关系的构建了。
毕竟采用new her()方法将her的属性设为对象自身属性,这样的代码是不可重用的,我们可以利用下述方法提高一些效率。这节的内容上文已经提到,毕竟温故知新也是很重要的。
1. 不要单独为继承关系创建新对象。
2. 尽量减少运行时的方式方式搜索(例如toString());
下面就是优化后的代码,修改的地方加粗显示(可能会与上文不太一样,其实也是一样的,都是相通的):
function her(){}; her.prototype.name = ‘Anna‘; her.prototype.toString = function(){ return this.name; } function his(){}; his.prototype = her.prototype; his.prototype.constructor = his; his.prototype.name = ‘Jock‘; function child(width, height){ this.width = width; this.height = height; } child.prototype = his.prototype; child.prototype.constructor = child; child.prototype.name = ‘clo‘; child.prototype.doing = function(){ return this.width * this.height / 2 }
测试结果依然相同:
var my = new child(10, 20); // 100my.toString(); // clo
我们来看一下,my对象在调用toString()方法时究竟内部发生了神马与之前不一样的事情,首先,javascript引擎会查看my对象有没有这个方法,显然没有,然后又会找child对象的原型prototype,此时child的原型属性已经指向了his的原型属性,而his的原型属性又指向了her的原型属性。更为重要的是,在这里的属性传递是引用传递而不是值传递。
这里已经有过去讲到的4步,变成了简单的两步了。
这样一来,从效率上来说是快了不少,但你有没有想过她有她的副作用。由于子对象和父对象指向的是同一个对象,一旦子对象对原型做出了修改,父对象也会修改,甚至所有的继承关系都会如此。
child.prototype.name = ‘los‘; var a = new her(); a.name; // los
所以,这种方法效率虽高,但不是任何场合都是适用的,即使用了这个方法,一定要留神那些同名的属性,是不是非常非常的累。。。。。。
时间: 2024-11-05 19:05:38