function Person(name){
this.name = name;
this.sum = function(){
alert(this.name)
}
}
Person.prototype.age = 10;
一、原型链继承( 函数原型指向另一个函数的实例 )
- 既可以继承构造函数的属性和方法,
- 又可以继承原型链上的属性和方法
- 实例化子类不能给父类传参
function Per(){
}
Per.prototype = new Person();
var per1 = new Per()
二、构造函数继承( 对象冒充实现继承 )
- 只能继承构造函数上的属性和方法(不能继承原型上)
- 实例化子类能给父类传参
function Con(){
Person.call(this,"jer");
this.age = 12;
}
var con1 = new Con();
console.log(con1.name);
console.log(con1.age);
console.log(con1 instanceof Person);
三、组合继承(组合原型链继承和借用构造函数继承)(常用)
- 既可以继承构造函数的属性和方法,又可以继承原型链上的属性和方法。
- 实例化子类能给父类传参
- 父类构造函数调用两次,消耗内存
//组合原型链和构造函数继承
function SubType(name){
Person.call(this,name);
SubType.prototype = new Person();
var sub = new SubType("gar");
console.log(sub.name);
console.log(sub.age);
四、原型式继承
- 所有实例都会继承原型上的属性
- 无法实现复用。(新实例属性都是后面添加的)
function content(obj){
function F(){};
F.prototype = obj;
return new F();
}
var sup = new Person();
var sup1 = content(sup);
console.log(sup1.age);
五、寄生式继承
function content(obj){
function F(){};
F.prototype = obj;
return new F();
}
var sup = new Person();
function subobject(obj){
var sub = content(obj);
sub.name = "gar";
return sub;
}
var sup2 = subobject(sup);
console.log(typeof subobject);
console.log(typeof sup2);
console.log(sup2.name);
六、寄生组合式继承(常用)
function content(obj){
function F(){};
F.prototype = obj;
return new F();
}
var con = content(Person.prototype);
function Sub(){
Person.call(this);
}
Sub.prototype = con;
con.constructor = Sub;
var sub1 = new Sub();
console.log(sub1.age);
function F(){};
F.prototype = Person.prototype;
function Sub(){
Person.call(this);
}
Sub.prototype = new F();
var sub2 = new Sub();
console.log(sub2.age);