JavaScript基礎之函式詳解
目錄
- 一、函式簡介
- 1.1.函式的建立
- 1.2.函式的引數和返回值
- 二、函式的型別
- 2.1. 建構函式
- 2.2. 立即執行函式
- 2.3. 建構函式的原型prototype
- 2.4. 函式中的this指向
- 2.5. 函式物件原型的方法
- 2.6. 建構函式的繼承
- 2.7. 原型物件prototype方法繼承
- 2.8. Object.creoRSHKdate實現類式繼承
- 總結
一、函式簡介
1.1.函式的建立
1.函式建立的三種方式
// 方式1:字串封裝程式碼建立函式 var fun = new Function("console.log('hello 我是第一個函式');"); console.log(fun); // 函式在被呼叫時執行 fun() // 方式2:函式宣告 function fun2() { console.log(fun2) } fun2() // 方式3:函式表示式 var fun3 = function () { console.log("我是匿名函式的封裝的程式碼") }; console.log(fun3) fun3();
1.2.函式的引數和返回值
1.函式的實參可以是一個物件或函式
function mianji(r){ return 3.14 * r * r; } function fun(a) { console.log("a = " + a) } fun(mianji(10)) fun(mianji)
2.函式的返回值可以是一個物件或函式:
function fun4(){ function fun5(){ alert("我是fun5") } return fun5; } a = fun4(); console.log(a) //輸出fun5函式體 a() //輸出"我是fun5" fun4()() //輸出"我是fun5"
二、函式的型別
2.1. 建構函式
function Person(name,age,gender) { this.name = name; this.age = age; this.gender = gender; this.sayName = function () { alert(this.name) }; } var per = new Person("張三",15,"男") var per2 = new Person("李四",16,"女") var per3 = new Person("王五",17,"男") console.log(per)
建構函式執行流程:
1.立刻建立一個物件
2.將新建的物件設定為函式中this
3.逐行執行函式中的程式碼
4.新建的物件最為返回值返回
總結: 如上為建構函式,必須用new關鍵字呼叫,普通函式時直接呼叫,用this替代obj
2.2. 立即執行函式
(function(){ alert("我是一個匿名函式") }) // 函式定義完,立即被呼叫,稱為立即執行函式
2.3. 建構函式的原型prototype
1. 規定,每一個建構函式都有一個prototype 屬性。
2.建構函式通過原型分配的函式是所有物件所共享的
3.我們可以把那些不變的方法,直接定義在 prototype 物件上,這樣所有物件的例項就可以共享這些方法。
簡介:每一個物件都會有一個屬性 proto 指向建構函式的 prototype 原型物件,例項物件使用建構函式 prototype 原型物件的屬性和方法,因為物件有 proto 原型的存在。
2.4. 函式中的this指向
1.當以函式的形式呼叫時,this是window;
2.當以方法的形式呼叫時,誰呼叫方法 this就是誰;
3.當以建構函式的形式呼叫時,this就是新建立的那個物件。
2.5. 函式物件原型的方法
1.Function.prototype.call():使用一個指定的 this 值呼叫一個函式(簡單理解為呼叫函式的方式,但是它可以改變函式的 this 指向)
2.Function.prototype.apply() 方法呼叫一個函式。簡單理解為呼叫函式的方式,但是它可以改變函式的 this 指向
3. Function.prototype.bind() 方法不會呼叫函式,但是能改變函式內部this 指向,返回的是原函式改變this之後產生的新函式
// 1.call方法
var o = {
name:"張美麗"
}
function fn(a,b) {
console.log(this);
console.log(a + b);
}
fn(1,3) //此時的this指向的是window 執行結果:3
fn.call(o,1,2) //此時的this指向的是物件o 執行結果:輸出物件o和3
// 2.apply方法
var o = {
name:'andy'
}
function fn1(a,b) {
consolehttp://www.cppcns.com.log(this);
console.log(a + b)
}
fn() //此時的this指向的是window 執行結果:3
fn.apply(o,[1,2]) //此時的this指向的物件o,執行結果:輸出物件o和3
// 3.bind方法
var o = {
name:'andy'
}
function fn1(a,b) {
console.log(this);
console.log(a + b)
}
var f = fn.bind(o,2) //此處的f是bind返回的新函式
f() //呼叫新函式 this指向的是物件o
2.6. 建構函式的繼承
1.先定義一個父建構函式
2.再定義一個子建構函式
3.子建構函式繼承父建構函式的屬性(使用call方法)
// 1.父建構函式 function Father(uname) { // this 指向父建構函式的物件例項 this.uname = uname; } // 2.子建構函式 function Son(uname,age) { // this指向子建構函式的物件例項 // 3.使用call方式實現子繼承父的屬性 Father.call(this.uname); this.age = age; } var son = new Son('王帥帥',18); console.log(son); // Son {age:18}
2.7. 原型物件prototype方法繼承
// 1.父建構函式 function Father(uname,age) { // this 指向父建構函式的物件例項 this.uname = uname; this.age = age; } Father.prototype.money = function() { console.log(100000); }; // 2.子建構函式 function Son(uname,score) { // this 指向子建構函式的物件例項 Father.call(this,uname,age); this.score = score; } // Son.prototype = Father.prototype; 這樣直接賦值會有問題,如果修改了子原型物件,父原型物件也會跟著一起變化 Son.prototype = new Father(); // 如果利用物件的形式修改了原型物件,別忘了利用constructor 指回原來的建構函式 Son.prototype.constructor = Son; // 這個是子建構函式專門的方法 Son.prototype.exam = function() { console.log('孩子要考試'); } var son = new Son('王帥哥',18,100); console.log(son); //存在一個Father原型物件,在Father裡面有age,exam;money在fahter外層的原型物件裡面。
2.8. Object.create實現類式繼承
// 父類 function Shape() { this.x = 0; this.y = 0; } // 子類 function Rectangle() { Shape.call(this); // 呼叫父類的建構函式 } // 將父類的原型物件,作為子類原型的原型物件。子類續承父類 Rectangle.prototype = Object.create(Shape.prototype); // 設定子類原型的建構函式 Rectangle.prototype.constructor = Rectangle; var r = new Rectangle(); r instanceof Rectangle; // true r instanceof Shape; // true
總結
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注我們的更多內容!