理解JavaScript面向對象的思路[2]

發表于:2009-11-12來源:作者:點擊數: 標簽:JavaScriptJavascriptjavascript面向對象思路
理解JavaScript面向對象的思路[2] Java開發 關鍵字:JavaScript 面向對象 按照標準,這個[[prototype]]語言使用者是無法訪問的,不過FireFox的JS引擎把[[prototype]]暴露出來,作為公有屬性"__proto__",這樣,我們就可以通過操作原型對象來控制一組對象的行
理解JavaScript面向對象的思路[2]  Java開發

關鍵字:JavaScript 面向對象

  按照標準,這個[[prototype]]語言使用者是無法訪問的,不過FireFox的JS引擎把[[prototype]]暴露出來,作為公有屬性"__proto__",這樣,我們就可以通過操作原型對象來控制一組對象的行為。我們可以借用FF提供的便利來了解一下[[prototype]]的工作原理:

  var proto={a:1};

  var m={__proto__:proto};

  var n={__proto__:proto};

  alert([m.a,n.a]);

  proto.a=2;

  alert([m.a,n.a]);

  JS規定了一個內建對象作為所有對象的最終[[prototype]],也就是說即使用{}創建的對象,也會有[[prototype]]指向這個內建對象。

  通過這個機制,我們完全可以得到跟基于類的語言相當程度的對象復用能力——但是當然我們還需要函數。在JS中,函數僅僅是一種特殊的對象,JS設計了()運算符和function關鍵字讓JS的函數看起來更像是傳統的語言。只要實現了私有方法[[call]]的對象都被認為是函數對象(這個[[call]]跟大家比較熟悉的Function.prototype.call完全是兩回事),類似[[prototype]],[[call]]也是語言使用者完全無法訪問的,這一次FF也沒有為我們提供公有屬性來替代。

  本來到這里為止,JS的面向對象已經很完整了,但是JS為了讓自己的語法看起來更像是Java之類的語言,又引入了new關鍵字,在上面大部分語言中new都是針對類來做的,而JS沒有類,甚至沒有聲明域,所以這個new還是要在對象上做文章,new會調用私有方法[[contruct]],任何實現了[[construct]]的對象都可以被new接受。然而如何才能讓一個對象可以被new呢?JS并沒有額外提供構造這種對象方法,所以所有通過function關鍵字構造的函數對象被設計成實現了[[construct]]方法。這也就是JS的new很奇怪地針對函數的原因。值得一提的是,并非只有函數可以被new,JS的宿主環境可能提供一些其它對象,典型的例子是IE中的ActiveXObject.

  所有函數的[[construct]]方法都是類似的:創建一個新的對象,將它的[[prototype]]設為函數對象的共有屬性prototype,以新對象做為this指針的值,執行函數對象

  這樣對同一函數的new運算實際上創建了相似的對象:擁有共同的原型[[prototype]],被同一函數處理過。這樣的new運算就很類似Class了,同時由于JS的動態性,所有的"類"在運行時任你宰割,想要模擬繼承之類的行為也就很容易了,由于是弱類型且是動態函數,不存在需要多態的問題,JS完全可以做到基于類的面向對象。

  最后提供幾道題,大家茶余飯后寫完程序不妨做做,都做對說明你已經理解了protype-based javascript

  (請用FF來看結果)

  Function.prototype.prop=1;

  alert(Object.prop)

  alert(Function.prop)

  

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97