js中對象繼承
1.js原型(prototype)實作繼承,所謂的原型鍊繼承
function Person(name,age){
this.name=name;
this.age=age;
}
Person.prototype.sayHello=function(){
alert("使用原型得到Name:"+this.name);
}
var per=new Person("豔傑",21);
per.sayHello(); //輸出:使用原型得到Name:豔傑
function Student(){}
Student.prototype=new Person("陶濤",21);
// var stu=new Student();
Student.prototype.grade=5;
Student.prototype.intr=function(){
alert(this.grade);
}
var stu=new Student();
stu.sayHello();//輸出:使用原型得到Name:陶濤
stu.intr();//輸出:5
這種原型繼承的方式存在缺點
缺點:
這種方法缺點比較明顯,看起來很不直覺,而且子類的方法不能優先于父類方法出現,通過new調用時,不能直接調用父類的構造函數而是要調用子類
2.構造函數實作繼承
function Parent(name){
this.name=name;
this.sayParent=function(){
alert("Parent:"+this.name);
}
}
function Child(name,age){
this.tempMethod=Parent;
this.tempMethod(name);
this.age=age;
this.sayChild=function(){
alert("Child:"+this.name+",age:"+this.age);
}
}
var parent=new Parent();
parent.sayParent("州林"); //輸出:“Parent:州林
var child=new Child();
child.sayChild("二狗子",24); //輸出:“Parent:二狗子”
構造函數的繼承方法在通過new調用時,不能直接調用父類的構造函數而是要調用子類。
3.call , apply實作繼承
function Person(name,age,love){
this.name=name;
this.age=age;
this.love=love;
this.say=function say(){
alert("姓名:"+name+',年齡:'+age+',love:'+love);
}
}
//call方式
function student(name,age,love){
Person.call(this,name,age,love);
}
//apply方式
function teacher(name,age,love){
Person.apply(this,[name,age,love]);
//Person.apply(this,arguments); //跟上句一樣的效果,arguments
}
var per=new Person("回首",25,"濤"); //輸出:“武鳳樓”
per.say();
var stu=new student("鄭志建",18,'我');//輸出:“曹玉”
stu.say();
var tea=new teacher("張寶",16,'小黑裙');//輸出:“秦傑”
tea.say();
//call與aplly的異同:
//1,第一個參數this都一樣,指目前對象
//2,第二個參數不一樣:call的是一個個的參數清單;apply的是一個數組(arguments也可以)
将this綁定在Person構造函數上運作,但是會導緻沒有自己的原型對象,無法共享原型的方法和屬性。
4.class繼承 extends實作
ES6之後有的方法,比較直覺,也符合邏輯
function Student(name) {
this.name = name;
}
Student.prototype.hello = function () {
alert('Hello, ' + this.name + '!');
}
class Student { //建立
constructor(name) {
this.name = name;
}
hello() {
alert('Hello, ' + this.name + '!');
}
}
var xiaoming = new Student('小明');
xiaoming.hello();
class PrimaryStudent extends Student {//繼承
constructor(name, grade) {
super(name); // 記得用super調用父類的構造方法!
this.grade = grade;
}
myGrade() {
alert('I am at grade ' + this.grade);
}
}
var xiaohong = new PrimaryStudent('小張','三年級')
xiaohong.hello()
xiaohong.myGrade()