- 对于初学这来说,掌握对象的继承方式是必修课,今天就在这里给大家总结下对象的几种继承方式。
- 在学习对象的继承方式之前,需要了解什么是原型及原型链的概念,不知道的话先去恶补下吧。
- js并不是一门面向对象的语言,没有类class的概念,在js中使用构造方法代替类class,实现模拟面向的对象编程方式。
第一种方式-----原型链继承
原型链继承:子构造方法的原型指向父构造方法的实例。
//声明父级构造函数
function Parent(name){
this.name = name;
}
//添加父级构造方法的原型属性
Parent.prototype.age = 18;
//实例化父级对象
var p = new Parent("小明");
//声明子级构造函数
function Son(){}
//将子级的构造函数的原型指向父级的实例
Son.prototype = p;
//创建子级的实例对象
var s = new Son();
//测试
console.log(s.name)//小明
console.log(s.age)//18
缺点:父级在实例化过程中必须传入参数,这样子级得到的属性值是确定的,得到的结果如不是自己想要的,还要手动更改。
第二种继承方式:借用构造函数
//声明父级构造函数
function Parent(name){
this.name = name;
}
//声明子级构造函数
function Son(name){
Parent.call(this,name)
}
//创建子级的实例对象
var s = new Son("小明");
//测试
console.log(s.name)//小明
优点:这种方式可以根据需求传入值,以得到不同的属性值
缺点:因为只是借用了父级的构造方法,给实例对象添加属性。并不能继承父级原型中的属性。
第三种方式:圣杯模式--结合原型链和借用构造函数
将需要传入参数,初始化的对象属性,通过借用构造方法继承.不需要初始化的属性,放在父构造函数的原型中,通过原型链继承.
//声明父级构造函数
function Parent(name){
this.name = name;
}
//添加父级构造方法的原型属性
Parent.prototype.age = 18;
//实例化父级对象----不传入参数
var p = new Parent();
//声明子级构造函数
function Son(name){
//借用父级构造函数
Parent.call(this,name);
}
//将子级的构造函数的原型指向父级的实例
Son.prototype = p;
//创建子级的实例对象
var s = new Son("小明");
//测试
console.log(s.name)//小明
console.log(s.age)//18
完美实现初始化实例属性,继承所有数据。