SQL中字串擷取函式(SUBSTRING)
阿新 • • 發佈:2021-06-28
1. 建構函式是什麼,有什麼作用
- 類似於Java的Class,是物件模板;專門用來生成例項物件的函式。
- JavaScript 語言的物件體系,不是基於“類”的,而是基於建構函式(constructor)和原型鏈(prototype)。
- 一個建構函式,可以生成多個例項物件,這些例項物件都有相同的結構。
2. new命令的作用
- 執行建構函式,返回一個例項物件。
3. 不使用new造成的影響與避免方法
- 造成的影響
- 建構函式就變成了普通函式,並不會生成例項物件。
- this這時代表全域性物件。
- 避免方法
- 一個解決辦法是,建構函式內部使用嚴格模式,即第一行加上use strict。這樣的話,一旦忘了使用new命令,直接呼叫建構函式就會報錯;由於嚴格模式中,函式內部的this不能指向全域性物件,預設等於undefined,導致不加new呼叫會報錯(JavaScript 不允許對undefined新增屬性)。
function Fubar(foo, bar){ 'use strict'; this._foo = foo; this._bar = bar; } Fubar() // TypeError: Cannot set property '_foo' of undefined
2.另一個解決辦法,建構函式內部判斷是否使用new命令,如果發現沒有使用,則直接返回一個例項物件。
function Fubar(foo, bar) { if (!(this instanceof Fubar)) { return new Fubar(foo, bar); } this._foo = foo; this._bar = bar; } Fubar(1, 2)._foo // 1 (new Fubar(1, 2))._foo // 1
4. new命令的原理
- 因為new命令總是返回一個物件,要麼是this指向的例項物件,要麼是return語句指定的物件。
- this指的是一個新生成的空物件,所有針對this的操作,都會發生在這個空物件上。建構函式之所以叫“建構函式”,就是說這個函式的目的,就是操作一個空物件(即this物件),將其“構造”為需要的樣子。
5. new命令程式碼實現
- 使用new命令時,它後面的函式依次執行下面的步驟:
- 建立一個空物件,作為將要返回的物件例項。
- 將這個空物件的原型,指向建構函式的prototype屬性。
- 將這個空物件賦值給函式內部的this關鍵字(函式內部this指向空物件)。
- 開始執行建構函式內部的程式碼。
- 程式碼實現:
function _new(/* 建構函式 */ constructor, /* 建構函式引數 */ params) { // 將 arguments 物件轉為陣列 var args = [].slice.call(arguments); // 取出建構函式 var constructor = args.shift(); // 建立一個空物件,繼承建構函式的 prototype 屬性 var context = Object.create(constructor.prototype); // 執行建構函式 var result = constructor.apply(context, args); // 如果返回結果是物件,就直接返回,否則返回 context 物件 return (typeof result === 'object' && result != null) ? result : context; } // 例項 var actor = _new(Person, '張三', 28);
6. 判斷函式呼叫時是否使用new命令
- 函式內部可以使用new.target屬性。如果當前函式是new命令呼叫,new.target指向當前函式,否則為undefined。
7. Object.create()建立例項物件
- 以這個現有的物件作為模板,生成新的例項物件