標籤:
1. js中的函數
1.1 函數定義的方法有三種
第一種:
function box(num1, num2){
????????????return num1 + num2;????????
????????}
第二種:
????????var box = function(num1, num2){
????????????return num1 + num2;
????????}
第三種:
????????var box = new Function(‘num1‘, ‘num2‘, ‘return num1+num2;‘);
那麼函數到底是什麼呢?
我們可以alert(box) 列印出的函數整個聲明
alert(typeof box); 列印出的是 function ,表明是一個fucntion 對象。
2. applay 和 call
是每一個函數所擁有的兩個方法,使用他們可以擴充函數的執行作用與。
同時每一個函數內部可以應用的內建對象由:this和arguments,第一個代表函數執行的作用與。第二個是函數的參數。
函數也是對象,所以函數也有屬性和方法。每一個函數都包含兩個屬性:
length 和 prototype 。其中length標識函數希望接受的具名引數的個數。
prototype 屬性,儲存蘇偶有執行個體方法。prototype有兩個方法 apply 和call
3. 在js中如何建立一個對象
3.1 直接使用 new Object
var obj = new Object();
obj.name = "jack";
obj.age = 19;
obj.sayHello = function(){
????alert("hello i‘am " + this.name);
}
這種做法雖然可以,但是當我們要建立大量的相同類型的對象時,就要寫相同的代碼,服用性非常差。
3.2 使用Factory 方法:
function createObject(name, age){
????var obj = new Object();
????obj.name = name;
????obj.age = age;
????obj.sayHello = function(){
????alert("hello i‘am " + this.name);
????}
????return obj;
}
此時我們就可以使用這種方法,建立大量的相同對象,但是,存在一個問題,就是 這樣建立的對象,無法進行類型識別。他們都是Object類型。所以在實際使用中非常不安全。
3.3 建構函式
function User(name, age){
????this.name = name;
????this.age = age;
????this.sayHello = function(){
????alert("hello i‘am " + this.name);
????}
}
上面的函數和Factory 方法的代碼非常相似,但是,他沒有 new Object,而是直接使用this。這中函數就是建構函式,他的使用方法是:
var user = new User(‘tom‘, 19);
同時我們可以使用 instanceof user 來識別其類型:是 User.
所以使用建構函式可以對對象進行類型識別。
但是,這種方法同樣存在一個問題,就是對於sayHello函數,每一個new出來的對象都有一份sayHello函數的拷貝。這樣就造成大量記憶體的浪費。所以我們這種方法還有待改進
3.4 使用全域函數來改進對象函數
function User(name, age){
????this.name = name;
????this.age = age;
????this.sayHello = sayHello;
}
function sayHello(){
????alert("hello i‘am " + this.name);
}
這樣的話,對於每一個new出來的對象。sayHello函數都只有唯一的一份拷貝,節省了記憶體。但是這樣做還是存在一個問題。就是sayHello函數也可以當作全域函數直接被使用,當其被直接使用是,this指標就是執行window域。其行為是未定義的,不可知的。其實從對象封裝的角度觸發,這樣的方法是破壞了對象的封裝,所以這種方法也不行。
javascript學習總結