js中的繼承(es5)
這個問題事關js裡面的很多難點的問題,諸如prototype
,call
和apply
等,也是js物件導向的問題,值得寫一篇.
-
call,apply
call
和apply
還是比較高階的用法,各個地方解釋不好懂,我的解釋就是:
改變某個方法執行時候的this指向,就是上下文環境,如果一個函式內輸出
this
為undefined
,那麼,實際上,call
是沒作用的,this
存在在物件裡面
func.call(obj,param1,param2) //物件的引數分別寫
func.apply(obj,[param1,param2]) //物件的引數寫成array
例如:
var add_obj = {
a:10,
b:2
}
function sub_obj(a,b){
console.log(this.a-this.b)
}
function add(a,b){
console.log(a,b)
console.log(this)
}
function sub(a,b){
console.log(a-b)
}
//1 僅僅執行sub,因為add中的this不存在,為undefined,不改變this指向
sub.call(add,2,1)
//1 相當於上面的輸出
sub.call(undefined,2,1)
//8, add_obj有this指向,sub_obj執行時候,呼叫add_obj的上下文環境,所以用的是add_obj的this中的a,b
sub_obj.call(add_obj ,2,1)
- 繼承的實現
//父類animal
var animal = function(name,food){
this.name = name
this.food = food
this.eat = function(){
console.log("I like eating "+food)
}
this.action = function(){
console.log("I can jump and run")
}
}
//子類dog
var dog = function(name,food,praise){
//實現:將animall的this指向dog的物件,dog的this就有了animal的方法
//在class內執行,無需要例項化,變可以暴露給this
animal.call(this,name,food)
this.praise = function(){
console.log(praise)
}
}
//呼叫
var Dog = new dog("dog","bone","Most of us like dog")
Dog.eat() //I like eating bone
Dog.action() //I can jump and run
Dog.praise() //Most of us like dog
- prototype繼承
var animal = function(name,food){
this.name = name
this.food = food
this.eat = function(){
console.log("I like eating "+food)
}
this.action = function(){
console.log("I can jump and run")
}
}
var dog = function(praise){
this.praise = function(){
console.log(praise)
}
}
//實現:其原型鏈指向animal的例項化物件
dog.prototype = new animal("dog","bone")
var Dog = new dog("Most of us like dog")
Dog.eat() //I like eating bone
Dog.action() //I can jump and run
Dog.praise() //Most of us like dog
- 建構函式繼承
var animal = function(name,food){
this.name = name
this.food = food
this.eat = function(){
console.log("I like eating "+food)
}
this.action = function(){
console.log("I can jump and run")
}
}
var dog = function(name,food,praise){
//實現:講animal類給dog的this物件,然後屬性開啟,而非例項化
this.temp = animal
this.temp(name,food)
this.praise = function(){
console.log(praise)
}
}
var Dog = new dog("dog","bone","Most of us like dog")
Dog.eat()
Dog.action()
Dog.praise()
-
物件導向
而且在用js開發時候,也可以用this
或者prototype
去進行物件化.
相關文章
- JS繼承es5和es6JS繼承
- JS中的繼承JS繼承
- ES6中的類繼承和ES5中的繼承模式詳解繼承模式
- JavaScript之ES5的繼承JavaScript繼承
- JS中的繼承(下)JS繼承
- 聊聊JS中的繼承JS繼承
- JS中的繼承(上)JS繼承
- es5 原型式繼承原型繼承
- es5繼承和es6類和繼承繼承
- JS中繼承的實現JS中繼繼承
- ES6繼承和ES5繼承是完全一樣的麼?繼承
- ES5和ES6中對繼承的實現繼承
- JS中的繼承與原型鏈JS繼承原型
- JS中的多種繼承方式JS繼承
- es5繼承和es6繼承中靜態方法、靜態屬性的差異繼承
- 如何用es5實現繼承繼承
- ES6與ES5繼承的解析繼承
- JS中繼承方式總結JS中繼繼承
- ES5和ES6的類的繼承繼承
- js之繼承JS繼承
- js繼承方式JS繼承
- 淺談JS的繼承JS繼承
- js的13種繼承JS繼承
- 圖解js的繼承圖解JS繼承
- JS原型鏈繼承JS原型繼承
- JS 相容、繼承、bind、thisJS繼承
- js 繼承小結JS繼承
- js繼承圖解JS繼承圖解
- JS的原型鏈和繼承JS原型繼承
- JS 繼承的正確操作JS繼承
- JS中的多種繼承方式(第12天)JS繼承
- ES5和ES6及繼承機制繼承
- 【JavaScript】ES5/ES6 建立物件與繼承JavaScript物件繼承
- es6 class繼承用es5實現繼承
- C++中公有繼承、保護繼承、私有繼承的區別C++繼承
- java中的繼承Java繼承
- PostgreSQL中的繼承SQL繼承
- JavaScript中的繼承JavaScript繼承