類別建構子
JavaScript的函數同時作為類別的建構函數,因此只要宣告一個函數就可以使用new關鍵字建立類別的實例。
function Person(name) { this.name = name; this.toString = function() { return 'Hello, ' + this.name + '!'; }; } var p = new Person('Ghostheaven'); alert(p); // Hello, Ghostheaven!
在上述實例中Person函數作為類別的建構函式使用,此時this指向新建立的實例對象,可以為實例增加屬性和方法,關於詳細的物件導向的JavaScript程式設計可以參考這篇文章。這裡我想說的是,JavaScript函數作為類別建構函數使用時的回傳值問題。
function MyClass(name) { this.name = name; return name; // 构造函数的返回值? } var obj1 = new MyClass('foo'); var obj2 = MyClass('foo'); var obj3 = new MyClass({}); var obj4 = MyClass({});
上面的建構子比較特別,有回傳語句,那麼obj1~obj4分別指向什麼物件呢?實際結果是這樣的:
obj1 = MyClass对象 obj2 = 'foo' obj3 = {} obj4 = {}
Function類別
在JavaScript執行時中有一個內建的類別叫做Function,用function關鍵字宣告一個函數其實是建立Function類別物件的一種簡寫形式,所有的函數都擁有Function類別的所有方法,例如call、apply、bind等等,可以透過instanceof關鍵字來驗證這個說法。
既然Function是一個類,那麼它的建構子就是Function(它本身也是Function類別的物件),應該可以透過new關鍵字來產生一個函數物件。第一個妖怪來了,就是如何用Function類別建構一個函式。 Function的語法如下:
new Function ([arg1[, arg2[, ... argN]],] functionBody)
其中arg1, arg2, ... argN是字串,代表參數名稱,functionBody也是字串,表示函數體,前面的參數名稱是可多可少的,Function的建構子會把最後一個參數當做函數體,前面的都當作參數處理。
var func1 = new Function('name', 'return "Hello, " + name + "!";'); func1('Ghostheaven'); // Hello, Ghostheaven!
以上方法就透過Function建構了一個函數,這個函數跟其他用function關鍵字宣告的函數一模一樣。
Function類別有它獨特的用途,你可以利用它動態地產生各種函數邏輯,或是取代eval函數的功能,而且能保持目前環境不會被污染*。
自更新函數
在許多語言中,函數一旦宣告過就無法再宣告同名函數,否則會產生語法錯誤,而在JavaScript中的函數不僅可以重複聲明,而且還可以自行更新自己。自己吃自己的妖怪來了!
function selfUpdate() { window.selfUpdate = function() { alert('second run!'); }; alert('first run!'); } selfUpdate(); // first run! selfUpdate(); // second run!
這種函數可以用來只運行一次的邏輯,在第一次運行之後就整個替換成一段新的邏輯。
以上是javascript類別建構函數和自己更新自己函數程式碼實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!