es5里的類(自己寫)
function Person(){
this.name = '張三';
this.age = 20;
}
var p = new Person();
p.name //張三
構(gòu)造函數(shù)和原型鏈里增加方法
function Person(){
this.name = '張三'; //屬性
this.age = 20;
this.run = function(){ //實例方法
console.log('xxx')
}
}
//通過原型鏈擴展屬性
Person.prototype.sex = '女'
//通過原型鏈擴展實例方法
Person.prototype.work = function(){
return '程序員'
}
var p = new Person();
p.work(); //程序員
//原型鏈上的屬性會被多個實例共享,構(gòu)造函數(shù)不會
實例方法必須通過newPerson才能調(diào)用
//定義靜態(tài)方法
Person.getInfo = fucntion(){
console.log('我是靜態(tài)方法')
}
//調(diào)用
Person.getInfo();
es5中的繼承
定義一個web類,繼承Person類
兩種方式1.原型鏈 2.對象冒充 3.組合
對象冒充
function Web(){
Person.call(this) //對象冒充實現(xiàn)繼承
//Web繼承了Person
}
var w = new Web();
w.run(); //xxx
w.work(); //報錯
//對象冒充可以繼承構(gòu)造函數(shù)里的方法,但是沒法繼承原型鏈上的屬性和方法
原型鏈實現(xiàn)繼承
Web.prototype = new Person(); //原型鏈實現(xiàn)繼承
var w = new Web();
w.work(); //程序員
w.run(); //xxx
//原型鏈繼承:既可以繼承構(gòu)造函數(shù)中的屬性和方法,也可以繼承原型鏈上的屬性和方法
原型鏈實現(xiàn)繼承的問題:
實例化子類的時候沒法給父類傳參
function Person(name,age){
this.name = name; //屬性
this.age = age;
this.run = function(){ //實例方法
console.log(name+'在運動')
}
}
Person.prototype.work = function(){
console.log(this.name+'是程序員')
}
var p = new Person('李四',20);
p.run(); //李四在運動
//web繼承person
function Web(name,age){
}
Web.prototype = new Person();
var w = new Web('張三',20)
w.run(); //undefined在運動
原型鏈+構(gòu)造函數(shù)的組合繼承模式
function Web(name,age){
Person.call(this,name,age) //可以繼承構(gòu)造函數(shù)里的子類和方法
}
Web.prototype = new Person();
var w = new Web('張三',20)
w.run(); //張三在運動
w.work(); //張三是程序員
換種寫法:
Web.prototype = Person.prototype
var w = new Web('張三',20)
w.run(); //張三在運動
w.work(); //張三是程序員