一、定義函式的三種方式
- 函式宣告方式 function a(){}
- 定義函式表示式方式 var a = function(){};
- 建構函式方式 var a = new Function(...arg,function){} 不推薦,但是指明瞭函式是物件,
二、函式是物件,那麼函式名就是指標,跟包含物件指標的其他變數沒有什麼不同。
三、函式宣告跟定義函式表示式區別
- 函式宣告在解析過程中會被函式宣告提前,無論何時呼叫都可以
- 定義函式表示式,則必須是執行到當前語句時,才會被執行。此時才可以被呼叫
四、arguments.callee
- callee屬性是一個指標,指向擁有這個arguments物件的函式。
五、函式的屬性跟方法
- 每個函式都包含的兩個屬性:prototype和length
- length:指的是引數個數
- prototype:儲存函式所有的例項方法,例如toString()和valueOf()等方法實際上都儲存在prototype名下,只不過通過各自物件例項呼叫而已。 是不可列舉的,所以不能被for in發現
- call和apply方法:每個函式都包含這兩個非繼承而來的方法。 他們都是在指定作用域中呼叫函式
- toLocalString()和toString()方法和valueOf()都是函式繼承來的。 六、基本包裝型別
- 基本包裝型別的存在期只在執行的這一行,這行過去後,就會立馬被銷燬。因此基本包裝型別沒有屬性跟方法
- var s = new String("nihao"); typeof(s); //"object" 對 基本 包裝 型別 的 例項 呼叫 typeof 會 返回" object",
建立物件
一、工廠模式:用函式來封裝以特定介面建立物件的細節
function createPerson( name, age, job){
var o = new Object();
o. name = name;
o. age = age;
o. job = job;
o. sayName = function(){
alert( this. name);
};
return o;
}
var person1 = createPerson(" Nicholas", 29, "Software Engineer");
var person2 = createPerson(" Greg", 27, "Doctor");
console.log(person3.sayName == person4.sayName); // false
console.log(person3.constructor == Object); // true
console.log(person3.constructor == createPerson); // false
複製程式碼
二、建構函式模式
三、原型模式:的 每個 函式 都有 一個 prototype( 原型) 屬性, 這個 屬性 是一 個 指標, 指向 一個 物件, 而這 個 物件 的 用途 是 包含 可以 由 特定 型別 的 所有 例項 共享 的 屬性 和 方法。 如果 按照 字面 意思 來 理解, 那麼 prototype 就是 通過 呼叫 構造 函式 而 建立 的 那個 物件 例項 的 原型 物件。 換句話說, 不必 在 構造 函式 中 定義 物件 例項 的 資訊, 而是 可以 將 這些 資訊 直接 新增 到 原型 物件 中
function Person(){ }
Person. prototype. name = "Nicholas";
Person. prototype. age = 29;
Person. prototype. job = "Software Engineer";
Person. prototype. sayName = function(){
alert( this. name);
};
var person1 = new Person();
person1. sayName(); //"Nicholas"
var person2 = new Person();
person2. sayName(); //"Nicholas"
複製程式碼
四、prototype 跟原型物件之間的關係
五、原型模式
- 物件例項可以訪問儲存在原型中的值,但是例項物件不能更改原型物件上的值。
- 原型 最初 只 包含 constructor 屬性, 而 該 屬性 也是 共享 的, 因此 可以 通過 物件 例項 訪問。
- 當 為 物件 例項 新增 一個 屬性 時, 這個 屬性 就會 遮蔽 原型 物件 中 儲存 的 同名 屬性;