所谓继承就是子类继承父类的特征与行为,使得子类对象具与父类相同的行为。但是javascript 是没有class、抽象类、接口等抽象概念,javascript 只有对象,那么js中是如何让对象与对象之间产生继承关系呢?
基于对象的继承在原型链中说过,如果在对象上没有找到需要的属性或者方法引用,js引擎就会继续在内部属性[[prototype]] 指向的对象上进行查找。同理如果还是没有找到需要的引用,就会继续查找它的内部属性[[prototype]]指向的对象,以此类推,层层向上直到找到对象的原型为null为止,这一系列的链接称为原型链。所以在原型链中我才会js中的继承是基于原型实现;
_proto_ 设计机制任何对象都有一个特殊的内部属性[[prototype]],[[prototype]]机制就是建立起对象之间的内部链接。如果有过后台开发经验的肯定会纳闷,为什么js要这样设计?引入原型对象的意义又是什么?为什么不跟java、.net 一样设计calss等等凝惑, 这里推荐 阮一峰的;
组合继承组合继承是比较常用的一种继承方法,思路是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又保证每个实例都有它自己的属性。
1 //人
2
function Person(name, age) {
3
this.name = name;
4
this.age = age;
5 }
6
Person.prototype.SayName = function () {
7
return this.name;
8 };
9
//父亲
10
function Parent(work, country, name, age) {
11
this.work = work;
12
this.country = country;
13
this.parentInfo = function () {
14
return 'hello 大家好,我叫:' + this.name +' 我是一名:' + this.work + ',我来自:' + this.country;
15
}
16
Person.call(this, name, age);//父类型传参
17 }
18
Parent.prototype = new Person();//重写Parent的原型对象,让parent的prototype 指向 Person 的实例
19
var myParent = new Parent('manager', 'China', 'Joel', 22);
20
console.log(myParent.SayName());//Joel
21
console.log(myParent.parentInfo());//hello 大家好,我叫:Joel 我是一名:manager,我来自:China
22
23
//儿子
24
function Child(work, country, name, age, sex) {
25
this.sex = sex;
26
this.childInfo = function () {
27
return 'hello 大家好,我叫:' + this.name + ' 我是一名:' + this.work + ',我来自美丽的:' + this.country
+ ',我是一个活泼可爱的 ' + this.sex;
28
}
29
Parent.call(this, work, country, name, age);//父类型传参
30 }
31
32
Child.prototype = new Parent();//重写Child的原型对象,让Child的prototype 指向 Parent 的实例
33
var myBaby = new Child('child', '广州', '超级飞侠-多多', 3, 'girl');
34
console.log(myBaby.parentInfo());//hello 我是一名:child,我来自:广州
35
console.log(myBaby.childInfo());//hello 大家好,我叫:超级飞侠-多多 我是一名:child,我来自美丽的:广州,我是一个活泼可爱的 girl