1. 程式人生 > 其它 >SQL中字串擷取函式(SUBSTRING)

SQL中字串擷取函式(SUBSTRING)

1. 建構函式是什麼,有什麼作用

  • 類似於Java的Class,是物件模板;專門用來生成例項物件的函式。
  • JavaScript 語言的物件體系,不是基於“類”的,而是基於建構函式(constructor)和原型鏈(prototype)。
  • 一個建構函式,可以生成多個例項物件,這些例項物件都有相同的結構。

2. new命令的作用

  • 執行建構函式,返回一個例項物件。

3. 不使用new造成的影響與避免方法

  • 造成的影響
  1. 建構函式就變成了普通函式,並不會生成例項物件。
  2. this這時代表全域性物件。
  • 避免方法
  1. 一個解決辦法是,建構函式內部使用嚴格模式,即第一行加上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命令時,它後面的函式依次執行下面的步驟:
  1. 建立一個空物件,作為將要返回的物件例項。
  2. 將這個空物件的原型,指向建構函式的prototype屬性。
  3. 將這個空物件賦值給函式內部的this關鍵字(函式內部this指向空物件)。
  4. 開始執行建構函式內部的程式碼。
  • 程式碼實現:
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()建立例項物件

  • 以這個現有的物件作為模板,生成新的例項物件