javascript 面向物件 new 關鍵字 原型鏈 建構函式
JavaScript面向物件
JavaScript 語言使用建構函式(constructor)作為物件的模板。所謂”建構函式”,就是專門用來生成例項物件的函式。它就是物件的模板,描述例項物件的基本結構。一個建構函式,可以生成多個例項物件,這些例項物件都有相同的結構
- 建構函式的首字母大寫,區分一般函式。
- 函式體內部使用了this關鍵字,代表了所要生成的物件例項。
- 生成物件的時候,必須使用new命令。
- 建構函式內部使用嚴格模式 'use strict',防止當做一般函式呼叫,這樣就會報錯。
function Person(name, age, sex) { 'use strict'; this.name = name; this.age = age; this.sex = sex; } Person() 報錯 new Person("zhangxc", 29, "male");
1、new關鍵字 命令內部實現
function _new(constructor, params) { // 接受個數不確定引數,第一個引數:建構函式;第二個到第n個引數:建構函式傳遞的引數。 // 1. 首先將引數組成一個數組 // 首先 .slice 這個方法在不接受任何引數的時候會返回 this 本身,這是一個 Array.prototype 下的方法,因此 this 就是指向呼叫 .slice 方法的陣列本身。 var args = Array.prototype.slice.call(arguments); // arguments偽陣列,獲取函式的所有引數的偽陣列。 // 等價於 // [].slice.call(arguments); // 2. 獲取建構函式 var constructor = args.shift(); // shift()返回陣列第一個元素 // 3. 使用建構函式原型建立一個物件。我們希望以這個現有的物件作為模板,生成新的例項物件,這時就可以使用Object.create()方法。 var context = Object.create(constructor.prototype); // Object.create()引數是一個物件,新建的物件繼承引數物件的所有屬性 // 4. 將引數屬性附加到物件上面 var result = constructor.apply(context, args); // 5. 返回一個物件 return (typeof result === 'object' && result != null) ? result : context; } function Person(name, age, sex) { this.name = name; this.age = age; this.sex = sex; } var args1 = _new(Person, "zhangxc", 18, "male"); // {name: "zhangxc", age: 18, sex: "male"} var args2 = new Person("zhangxc", 18, "male"); // {name: "zhangxc", age: 18, sex: "male"}
new.target屬性
如果當前函式是new命令呼叫,new.target指向當前函式(建構函式的名稱),否則為undefined。
function Test() { console.log(new.target === Test); } Test() // false new Test() // true
2、this關鍵字
...
3、物件的繼承
... 待完善