js的继承

如果原型对象等于另一个类型的实例,结果如何?

构造函数.prototype = 原型对象
原型对象.constructor = 构造函数(模板)
原型对象.isPrototypeOf(实例对象) 判断实例对象的原型是不是当前对象
构造函数和实例对象的关系就是类和实例的对象

如果原型对象等于另一个类型的实例,结果如何?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//父类构造函数sup
function Sup(name) {
this.name = name;
}

//父类的原型对象
Sup.prototype = {
constructor:Sup,
say:function(){
console.log(this.name);
}
}

//子类构造函数sub
function Sub(age) {
this.age = age;
}

//让子类的原型对象等于父类的实例
Sub.prototype = new Sup('jack');
//显然此时的原型对象将包含一个指向另一个原型的指针,相应的另一个原型中也包含着一个指向另一个构造函数的指针

//子类的原型对象的构造器变成了父类的构造器

var sub = new Sub();
sub.say();

原型继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//父类
function Person(name,age) {
this.name = name;
this.age = age;
}

//子类
function Boy(sex) {
this.sex = sex;
}

//继承已经实现
Boy.prototype = new Person('jack');

var b = new Boy();
console.log(b.name);//jack

//原型继承即的特点:即继承了父类的模板,又继承了父类的原型对象

类继承

只继承模板。不继承原型对象(借用构造函数的方式继承)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function Person(name,age) {
this.name = name;
this.age = age;
}
Person.prototype.id = 10;

function Boy(name,age,sex){
Person.call(this,name,age);
this.sex = sex;
}
var b = new Boy('jack',18,'male');

console.log(b.name);//jack
console.log(b.id);//undefined

原型继承+借用构造函数继承=符合继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//父类
function Person(name,age){
this.name = name;
this.age = age;
}

//父类的原型对象属性
Person.prototype.id = 10;
Person.prototype.say = function(){console.log(this.name)};

//子类
function Boy(name,age,sex) {
Person.call(this.name,age);//借用构造函数继承,继承父类的模板
this.sex = sex;
}

//原型继承,继承父类的实例和父类的原型杜希昂关系
Boy.prototype = new Person();

var b = new Boy('jack',18,'male');
console.log(b.name);
b.say();