ECMAScript 函式 修改物件

2022-04-03 23:16:48 字數 2553 閱讀 3851

通過使用 ecmascript,不僅可以建立物件,還可以修改已有物件的行為。

prototype 屬性不僅可以定義建構函式的屬性和方法,還可以為本地物件新增屬性和方法。

建立新方法

通過已有的方法建立新方法

可以用 prototype 屬性為任何已有的類定義新方法,就像處理自己的類一樣。例如,還記得 number 類的 tostring() 方法嗎?如果給它傳遞引數 16,它將輸出十六進製制的字串。如果這個方法的引數是 2,那麼它將輸出二進位制的字串。我們可以建立乙個方法,可以把數字物件直接轉換為十六進製制字串。建立這個方法非常簡單:

number.prototype.tohexstring = function() ;
在此環境中,關鍵字 this 指向 number 的例項,因此可完全訪問 number 的所有方法。有了這段**,可實現下面的操作:

var inum = 15;

alert(inum.tohexstring()); //輸出 "f"

由於數字 15 等於十六進製制中的 f,因此警告將顯示 "f"。
重新命名已有方法

我們還可以為已有的方法命名更易懂的名稱。例如,可以給 array 類新增兩個方法 enqueue() 和 dequeue(),只讓它們反覆呼叫已有的 push() 和 shift() 方法即可:

array.prototype.enqueue = function(vitem) ;

array.prototype.dequeue = function() ;

新增與已有方法無關的方法

當然,還可以新增與已有方法無關的方法。例如,假設要判斷某個項在陣列中的位置,沒有本地方法可以做這種事情。我們可以輕鬆地建立下面的方法:

array.prototype.indexof = function (vitem) ;

var str = "hello";

var inum = 25;

str.showvalue(); //輸出 "hello"

inum.showvalue(); //輸出 "25"

這裡,string 和 number 物件都從 object 物件繼承了 showvalue() 方法,分別在它們的物件上呼叫該方法,將顯示 "hello" 和 "25"。
重定義已有方法

就像能給已有的類定義新方法一樣,也可重定義已有的方法。如前面的章節所述,函式名只是指向函式的指標,因此可以輕鬆地指向其他函式。如果修改了本地方法,如 tostring(),會出現什麼情況呢?

function.prototype.tostring = function()
前面的**完全合法,執行結果完全符合預期:

function sayhi() 

alert(sayhi.tostring()); //輸出 "function code hidden"

也許你還記得,function 物件這一章中介紹過 function 的 tostring() 方法通常輸出的是函式的源**。覆蓋該方法,可以返回另乙個字串(在這個例子中,可以返回 "function code hidden")。不過,tostring() 指向的原始函式怎麼了呢?它將被無用儲存單元**程式**,因為它被完全廢棄了。沒有能夠恢復原始函式的方法,所以在覆蓋原始方法前,比較安全的做法是儲存它的指標,以便以後的使用。有時你甚至可能在新方法中呼叫原始方法:

function.prototype.originaltostring = function.prototype.tostring;function.prototype.tostring = function()  else 

};

在這段**中,第一行**把對當前 tostring() 方法的引用儲存在屬性 originaltostring 中。然後用定製的方法覆蓋了 tostring() 方法。新方法將檢查該函式源**的長度是否大於 100。如果是,就返回錯誤資訊,說明該函式**太長,否則呼叫 originaltostring() 方法,返回函式的源**。
極晚繫結(very late binding)

從技術上講,根本不存在極晚繫結。本書採用該術語描述 ecmascript 中的一種現象,即能夠在物件例項化後再定義它的方法。例如:

var o = new object();

object.prototype.sayhi = function () ;

o.sayhi();

在大多數程式語言中,必須在例項化物件之前定義物件的方法。這裡,方法 sayhi() 是在建立 object 類的乙個例項之後來新增進來的。在傳統語言中不僅沒聽說過這種操作,也沒聽說過該方法還會自動賦予 object 物件的例項並能立即使用(接下來的一行)。

注意:不建議使用極晚繫結方法,因為很難對其跟蹤和記錄。不過,還是應該了解這種可能。

ECMAScript 箭頭函式

一 ecmascript 箭頭函式 es5中的函式定義 es5中定義函式 方式一 function sum x,y 方式二 varsum function sum x,y console.log sum 4,5 這兩種定義方式的區別 1.方式一 定義的函式,無論你在函式前呼叫,還是函式後呼叫,都不會...

ECMAScript中的函式

有 3 種定義函式的方式 函式宣告 function關鍵字後需要指定函式名 function sum num1,num2 不加分號 console.log sum 2,3 5函式表示式 function關鍵字後不用指定函式名 函式末尾需要新增乙個分號,就像宣告其他變數時一樣 var sum func...

ECMAScript中函式function型別

說起來ecmascript中上面最有意思,我想那莫過於函式了,有意思的根源,則在於函式實際上是物件。每個函式都是function型別的例項,而且都與其他引用型別一樣具有屬性和方法。由於函式是物件,因此函式名實際上也是乙個指向函式物件的指標,不會與某個函式繫結。函式通常是使用函式宣告語法定義的,如下例...