JavaScript prototype屬性與修改對象

來源:互聯網
上載者:User

JavaScript prototype屬性

 

定義與用法

prototype 屬性使您有能力向對象添加屬性和方法。

 

文法

object.prototype.name=value

 

執行個體

在本例中,我們將展示如何使用 prototype 屬性來向對象添加屬性:

<script type="text/javascript">function employee(name,job,born){this.name=name;this.job=job;this.born=born;}var bill=new employee("Bill Gates","Engineer",1985);employee.prototype.salary=null;bill.salary=20000;document.write(bill.salary);</script>

輸出:

20000

 

================================================================================

 

JavaScript prototype修改對象

 

通過使用 ECMAScript,不僅可以建立對象,還可以修改已有對象的行為。

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

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

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

Number.prototype.toHexString = function() {  return this.toString(16);};

 

在此環境中,關鍵字 this 指向 Number 的執行個體,因此可完全訪問 Number 的所有方法。有了這段代碼,可實現下面的操作:

var iNum = 15;alert(iNum.toHexString());//輸出 "F"

由於數字 15 等於十六進位中的 F,因此警告將顯示 "F"。

 

重新命名已有方法

我們還可以為已有的方法命名更易懂的名稱。例如,可以給 Array 類添加兩個方法 enqueue() 和 dequeue(),只讓它們反覆調用已有的 push() 和 shift() 方法即可:

Array.prototype.enqueue = function(vItem) {  this.push(vItem);};Array.prototype.dequeue = function() {  return this.shift();};

添加與已有方法無關的方法

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

Array.prototype.indexOf = function (vItem) {  for (var i=0; i<this.length; i++) {    if (vItem == this[i]) {  return i;}  }  return -1;}

 

該方法 indexOf() 與 String 類的同名方法保持一致,在數組中檢索每個項,直到發現與傳進來的項相同的項目為止。如果找到相同的項,則返回該項的位置,否則,返回 -1。有了這種定義,我們可以編寫下面的代碼:

var aColors = new Array("red","green","blue");alert(aColors.indexOf("green"));//輸出 "1"

為本機物件添加新方法

最後,如果想給 ECMAScript 中每個本機物件添加新方法,必須在 Object 對象的 prototype 屬性上定義它。前面的章節我們講過,所有本機物件都繼承了 Object 對象,所以對 Object 對象做任何改變,都會反應在所有本機物件上。例如,如果想添加一個用警告輸出對象的當前值的方法,可以採用下面的代碼:

Object.prototype.showValue = function () {  alert(this.valueOf());};var str = "hello";var iNum = 25;str.showValue();//輸出 "hello"iNum.showValue();//輸出 "25"

這裡,String 和 Number 對象都從 Object 對象繼承了 showValue() 方法,分別在它們的對象上調用該方法,將顯示 "hello" 和 "25"。

重定義已有方法

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

Function.prototype.toString = function() {  return "Function code hidden";}

 

前面的代碼完全合法,運行結果完全符合預期:

function sayHi() {  alert("hi");}alert(sayHi.toString());//輸出 "Function code hidden"

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

Function.prototype.originalToString = Function.prototype.toString;Function.prototype.toString = function() {  if (this.originalToString().length > 100) {    return "Function too long to display.";  } else {    return this.originalToString();  }};

在這段代碼中,第一行代碼把對當前 toString() 方法的引用儲存在屬性 originalToString 中。然後用定製的方法覆蓋了 toString() 方法。新方法將檢查該函數原始碼的長度是否大於 100。如果是,就返回錯誤資訊,說明該函數代碼太長,否則調用 originalToString() 方法,返回函數的原始碼。

極晚綁定(Very Late Binding)

從技術上講,根本不存在極晚綁定。本書採用該術語描述 ECMAScript 中的一種現象,即能夠在對象執行個體化後再定義它的方法。例如:

var o = new Object();Object.prototype.sayHi = function () {  alert("hi");};o.sayHi();

在大多數程式設計語言中,必須在執行個體化對象之前定義對象的方法。這裡,方法 sayHi() 是在建立 Object 類的一個執行個體之後來添加進來的。在傳統語言中不僅沒聽說過這種操作,也沒聽說過該方法還會自動賦予 Object 對象的執行個體並能立即使用(接下來的一行)。

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

 

 

轉載聲明: 本文轉自 http://www.w3school.com.cn/js/pro_js_object_modifying.asp

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.