javascript --- 构造器借用
2024-08-30 07:30:00
接下来我们在看一种继承的实现。这需要再次利用构造器函数入手,这回不直接使用对象了。由于在这种继承模式中,子对象构造器可以通过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;
最新文章
- PHP中JSON的跨域调用
- ios block 导致的循环引用
- Apache Common DbUtils
- struts2 token 使用说明
- MSSQL 查询分组前N条记录
- java的异常处理机制(try…catch…finally)
- Spring Cloud App(Service) Pom示例
- Oracle基本分组查询group by的使用
- webapi拦截请求
- [置顶] 单键模式的C++描述
- VS2010中安装AjaxControlToolkit
- Javascript面对对象. 第一篇
- Zabbix实战-简易教程--告警屏蔽(Maintenances)
- [Note] 计算机网络的应用层
- storm中的Scheduler
- 13-03 Java 基本类型包装类概述,Integer类,Character
- 模型评估——ROC、KS
- 2019.01.26 codeforces 1096G. Lucky Tickets(生成函数)
- NetCore入门篇:(六)Net Core项目使用Controller之一
- Spring在xml配置里配置事务