首页 > 代码库 > javascript --- 只继承于原型

javascript --- 只继承于原型

如上次所述,,出于效率考虑,我们应该尽可能的将一些可重用的属性和方法添加到原型中去。

如果养成了这个好习惯,我们仅仅依靠原型就能顺利的完成继承关系的构建了。

毕竟采用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); // 100
my.toString(); // clo

 

我们来看一下,my对象在调用toString()方法时究竟内部发生了神马与之前不一样的事情,首先,javascript引擎会查看my对象有没有这个方法,显然没有,然后又会找child对象的原型prototype,此时child的原型属性已经指向了his的原型属性,而his的原型属性又指向了her的原型属性。更为重要的是,在这里的属性传递是引用传递而不是值传递。

这里已经有过去讲到的4步,变成了简单的两步了。

这样一来,从效率上来说是快了不少,但你有没有想过她有她的副作用。由于子对象和父对象指向的是同一个对象,一旦子对象对原型做出了修改,父对象也会修改,甚至所有的继承关系都会如此。

child.prototype.name = ‘los‘;var a = new her();a.name; // los

 

所以,这种方法效率虽高,但不是任何场合都是适用的,即使用了这个方法,一定要留神那些同名的属性,是不是非常非常的累。。。。。。

 

javascript --- 只继承于原型