您的位置:首页 > Web前端 > JavaScript

javascript --- 只继承于原型

2016-08-31 23:09 197 查看
如上次所述,,出于效率考虑,我们应该尽可能的将一些可重用的属性和方法添加到原型中去。

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

毕竟采用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


所以,这种方法效率虽高,但不是任何场合都是适用的,即使用了这个方法,一定要留神那些同名的属性,是不是非常非常的累。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: