接下来我们在看一种继承的实现。这需要再次利用构造器函数入手,这回不直接使用对象了。由于在这种继承模式中,子对象构造器可以通过call()和apply()方法来调用父对象的构造器。因而可以被称作构造器盗用法。

我们在这里call()和apply()方法更进一步的讨论一下,虽然之前说过一些,只不过都是基础性的吧。

这两个方法都允许我们将一个对象的this值一个函数的调用绑定起来。

下面,我们来构建一个父类构造器Shape();

function Shape(id){
    this.id = id;
}
shape.prototype.name = 'shape';
shape.prototype.toString = function(){
    return this.name;
}

现在我们来定义Triangle()构造器,在其中调用apply()方法来调用Shape()构造器,并将相关的this值(即new Triangle()所创造的实例)和其他一些传递参数的方法。

function Triangle(){
    Shape.apply(this.arguments);
}
Triangle.prototype.name = 'Anna';

注意,这里无论是Triangle()还是Shape()都在其各自的原型中添加一些额外的方法。

var t = new Triangle(101);
t.name; // Anna

在这里,新的triangle对象继承了其父对象的id属性,但她没有继承父对象原型中的其他东西。

t.id;
t.toSting(); // [Object Object];

为什嘛没有继承shape属性呢?是因为我们从来没有new shape()创建一个实例,自然原型没有被用到。

function Triangle(){
    Shape.apply(this, anguments);
}
Triangle.prototype = new Shape();
Triangle.prototype.name = 'Jock';

这种继承模式中,父对象的属性是以子对象自身的属性的身份来重建的。这也体现了构造器借用的一大优势;当我们创建一个继承于数组或其他对象时,将获得一个完完整整的新值(不是一个新值),对他做任何修改都不会影响到其他父对象。

但这种模式也是有缺点的,因为这种情况下父对象的构造器往往会被调用2次:一次发生在通过apply()方式继承继承自身属性,而另一次则发生在new操作符继承其原型时。这样一来,父对象的自身属性事实上被继承了两次。

function Shape(id){
    this.id = id;
}
function Triangle(){
    Shape.apply(this, argument);
}
Triangle.prototype = new Shape(101);

然后我们新建一个实例:

var t = new Triangle(202);
t.id; // 202;

如您所见,对象有一个自身属性id,但她并非来自原型链中,我们可以执行如下验证:

t._proto_.id;
delete t.id;
t.id; 

最新文章

  1. PHP中JSON的跨域调用
  2. ios block 导致的循环引用
  3. Apache Common DbUtils
  4. struts2 token 使用说明
  5. MSSQL 查询分组前N条记录
  6. java的异常处理机制(try…catch…finally)
  7. Spring Cloud App(Service) Pom示例
  8. Oracle基本分组查询group by的使用
  9. webapi拦截请求
  10. [置顶] 单键模式的C++描述
  11. VS2010中安装AjaxControlToolkit
  12. Javascript面对对象. 第一篇
  13. Zabbix实战-简易教程--告警屏蔽(Maintenances)
  14. [Note] 计算机网络的应用层
  15. storm中的Scheduler
  16. 13-03 Java 基本类型包装类概述,Integer类,Character
  17. 模型评估——ROC、KS
  18. 2019.01.26 codeforces 1096G. Lucky Tickets(生成函数)
  19. NetCore入门篇:(六)Net Core项目使用Controller之一
  20. Spring在xml配置里配置事务

热门文章

  1. executing an update/delete query问题
  2. Mac 之 STF 搭建(淘宝源安装)
  3. foy: 轻量级的基于 nodejs 的通用 build 工具
  4. webdriver高级应用- 操作富文本框
  5. python 学习分享-基础篇
  6. jquery拼接字符串
  7. CF878D D. Magic Breeding bitset
  8. sqlserver修改一个列
  9. 开发者选择短视频SDK,为何青睐七牛云?
  10. Luogu【P1725】琪露诺(单调队列,DP)