javascript --- 构造器借用
接下来我们在看一种继承的实现。这需要再次利用构造器函数入手,这回不直接使用对象了。由于在这种继承模式中,子对象构造器可以通过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;

javascript --- 构造器借用的更多相关文章
- Constructor JavaScript构造器模式。
构造器模式 : Constructor模式中, 通过在构造器前面加 new 关键字, 告诉JavaScript 像使用构造器一样实例化一个新对象,并且对象成员由该函数定义. 构造器内, 使用this ...
- javascript继承之借用构造函数与原型
javascript继承之借用构造函数与原型 在js中,关于继承只有利用构造函数和原型链两种来现实.以前所见到的种种方法与模式,只不过是变种罢了. 借用构造函数 1 2 3 4 5 6 7 8 9 1 ...
- 详解Javascript的继承实现(二)
上文<详解Javascript的继承实现>介绍了一个通用的继承库,基于该库,可以快速构建带继承关系和静态成员的javascript类,好使用也好理解,额外的好处是,如果所有类都用这种库来构 ...
- javascript 中继承实现方式归纳
转载自:http://sentsin.com/web/1109.html 不同于基于类的编程语言,如 C++ 和 Java,javascript 中的继承方式是基于原型的.同时由于 javascrip ...
- javascript的面向对象思想知识要点
获取数据类型 typeof undefined:访问某个不存在的或未经赋值的变量时就会得到一个 undefined,用typeof 获取类型,得到的也是undefined;null:它不能通过java ...
- javascript --- 继承小结
回顾之前学到的知识,大体上可以分为两类: 1. 基于构造器工作的模式. 2. 基于对象的工作模式. 3. 是否使用原型 4. 是否执行属性拷贝. 5. 两者都有(执行原型属性拷贝) 下面我们把之前的知 ...
- 读《JavaScript面向对象编程指南》(二)
第五章 原型 在JavaScript中,所有函数都会拥有一个 prototype 的属性,默认初始值为空对象. 可以在相关的原型对象中添加新的方法和属性,甚至可以用自定义对象来完全替换掉原有的原型对象 ...
- JavaScript学习总结(三)——this、原型、javascript面向对象
一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...
- JavaScript增强AJAX基础
<title>js类型</title> <meta http-equiv="content-type" content="text/html ...
随机推荐
- POJ:3041-Asteroids(匈牙利算法模板)
传送门:http://poj.org/problem?id=3041 Asteroids Time Limit: 1000MS Memory Limit: 65536K Description Bes ...
- POJ:1086-Parencodings
Parencodings Time Limit: 1000MS Memory Limit: 10000K Description Let S = s1 s2-s2n be a well-formed ...
- (转)全网最!详!细!tarjan算法讲解
byhttp://www.cnblogs.com/uncle-lu/p/5876729.html 全网最详细tarjan算法讲解,我不敢说别的.反正其他tarjan算法讲解,我看了半天才看懂.我写的这 ...
- WCF服务编程——数据契约快速入门
WCF序列化流程 序列化 默认用户自定义类型(类和结构)并不支持序列化,因为.NET无法判断对象状态是否需要反射到流. 用户自定义类的实例支持序列化 需要添加[Serialazable].若要允许可序 ...
- Java容器jdk1.6 Array
参考:https://www.cnblogs.com/tstd/p/5042087.html 1.定义 顶层接口collection public interface Collection<E& ...
- 刷题总结——解方程(NOIP2014)
题目: 题目描述 已知多项式方程: a0+a1x+a2x2+…+anxn=0 求这个方程在[1,m]内的整数解(n 和 m 均为正整数). 输入格式 输入共 n+2 行. 第一行包含 2 个整数 n. ...
- java面试题之死锁产生的条件,以及如何避免死锁,银行家算法,产生死锁后如何解决(阿里面试题)
死锁产生的四个必要条件: 互斥:一个资源每次只能被一个进程使用(资源独立) 请求与保持:一个进程因请求资源而阻塞时,对已获得的资源保持不放(不释放锁) 不剥夺:进程已获得的资源,在未使用之前,不能强行 ...
- [暑假集训--数位dp]hdu3555 Bomb
The counter-terrorists found a time bomb in the dust. But this time the terrorists improve on the ti ...
- 使用Collectors.toMap遇到NullPointerException
这个坑也是踩过好几次了,记录一笔. 当试图使用Collectors.toMap将一个stream收集为Map的时候,若构造map的valueMapper返回null时,则会报NullPointerEx ...
- maven项目打包 编码gbk的不可映射字符
中文系统默认gbk编码格式,你的代码是utf8格式的.所以报错 <build> <plugins> <plugin> <groupId>org.apac ...