一.JS函數:
函數簡單的說就是重複執行的代碼塊。函數是這樣的一段JavaScript 代碼,它只定義一次,但可能被執行或調用任意次。
(1).函數的定義方式:
1.聲明式函數定義: function 函數名 (){};這種定義方式,會將函數聲明提升到該函數所在作用域的最開頭,也是就無論你在這個函數的最小作用域的那兒使用這種方式聲明的函數,在這個作用域內,你都可以調用這個函數爲你所用。
2.函數表達式:let fun = function(){}; 此方式定義的函數,只能在該作用域中,這段賦值代碼執行之後才能通過fun()調用函數,否則,由於變量聲明提升,fun === undefined。
3.new Function 形式: var fun1 = new Function (arg1 , arg2 ,arg3 ,…, argN , body );Function構造函數所有的參數都是字符串類型。除了最後一個參數, 其餘的參數都作爲生成函數的參數即形參。這裏可以沒有參數。最後一個參數, 表示的是要創建函數的函數體。
注意:1 、第一種和第二種函數的定義的方式其實是第三種new Function 的語法糖,當我們定義函數時候都會通過 new Function 來創建一個函數,只是前兩種爲我們進行了封裝,我們看不見了而已,js 中任意函數都是Function 的實例。
二.構造函數:
(1).定義:通過 new 函數名 來實例化對象的函數叫構造函數。任何的函數都可以作爲構造函數存在。之所以有構造函數與普通函數之分,主要從功能上進行區別的,構造函數的主要 功能爲 初始化對象,特點是和new 一起使用。new就是在創建對象,從無到有,構造函數就是在爲初始化的對象添加屬性和方法。構造函數定義時首字母大寫。
(2).對new理解:new 申請內存, 創建對象,當調用new時,後臺會隱式執行new Object()創建對象。所以,通過new創建的字符串、數字是引用類型,而是非值類型。
(3).
1. var arr = []; 爲 var arr = new Array();
2. var obj = {} 爲 var obj = new Object();
(4).執行構造函數時發生的事 :
let f = new Foo();
function Foo(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
Foo.prototype.belief = function(){
console.log('打印');
}
let f = new Foo ('zh',18,'男');
以上代碼詳解如下:
(1). let f = {}; //一個繼承自 Foo.prototype 的新對象被創建。
(2). f.proto = Foo.prototype; // f 繼承 Foo的原型 ==
(3).Foo.call(f,‘zh’,18,‘男’); //執行Foo函數,將name,age,sex 參數傳入Foo中執行,此時函數內部this 爲 new 創建的 f對象,所以 f.name = ‘zh’;f.age = 18; f.sex = ‘男’;
(4).實例化對象完成,此時
f = {
name:'zh',
age:18,
sex:'男'
}
(5). f.belief(); // 打印
(6).手寫一個NEW方法:
function newTest (constructFunction){
let obj = {};
obj.__proto__ = constructFunction.prototype;
return function(){
constructFunction.apply(obj,arguments);
return obj;
}
}
注意:當構造函數中有返回對象時候,最終new出來的對象會是構造函數的返回值,而不是new過程中生成的對象。僅當構造函數返回值是對象時有效,當不是對象時依舊返回new過程中形成的對象(無論如何new 構造函數之後都會返回一個對象值)。