日韩欧美人妻无码精品白浆,www.大香蕉久久网,狠狠的日狠狠的操,日本好好热在线观看

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網站管理員

JS技巧:理解JavaScript面向對象的思路

admin
2010年8月17日 23:3 本文熱度 4427
一般來說大家比較熟悉的面向對象方式是基于類的面向對象,聲明一個類,然后在根據(jù)類聲明的描述去創(chuàng)建對象,通過類與類之間的繼承和組合關系來復用代碼。大多數(shù)情況下,基于類的面向對象語言(C++,C#,Java之類的)都把類整合進自己的類型系統(tǒng),即每個類(Class)同時也是一個變量類型(Variable Type),并允許子類類型的值被賦值給父類類型變量。

而JS的設計采用了一種完全不同的思路。首先JS的類型是不可擴展的(就是說,語言的使用者無法添加新的類型)這樣就無法采用上述語言的做法。根據(jù)語言標準,JS設計了6種用戶可以使用的數(shù)據(jù)類型(因為JS是弱類型的,所以變量沒有類型,只有數(shù)據(jù)有類型):
Boolean Number String Null Undefined Object

為了實現(xiàn)面向對象,JS把所有的對象放到Object類型中,這樣,JS就有6種用戶可使用的數(shù)據(jù)類型。除了Undefined,JS為所有的類型提供了字面值(literal)語法,現(xiàn)在來看,JS的Object字面值表示設計的相當成功,現(xiàn)在甚至成為了一種數(shù)據(jù)交換的格式,這就是大家所熟悉的JSON。A Sample:

var aTShirt={color:"yellow",size:"big"}
作為動態(tài)語言,JS允許使用者對一個已經創(chuàng)建的對象添加或者刪除屬性。對一個不存在的屬性賦值即向其添加屬性,delete關鍵字被用于刪除屬性。這個delete比較容易跟C++的delete運算符混淆,后者是用來釋放不再使用的對象的。

本來有了這些語法,已經可以做基本的面向對象編程了,但是僅僅如此,JS代碼復用性比其它語言弱太多。比如,你甚至無法為一組對象做一個統(tǒng)一的操作,必須通過循環(huán)遍歷來實現(xiàn),于是JS引入了原型(prototype),具體的實現(xiàn)方式是為每個對象規(guī)定一個私有屬性[[prototype]],當讀取一個對象的屬性時,如果對象本身沒有這個屬性,會嘗試訪問[[prototype]]的相應屬性。具體實現(xiàn)中,[[prototype]]所指向的對象仍然可以有[[prototype]],實際的訪問就是一個鏈式的操作,直到找到這個屬性或者[[prototype]]為空為止,所以常常聽到[[prototype]]鏈的說法。為了防止[[prototype]]出現(xiàn)循環(huán),JS引擎會在任何對象的[[prototype]]屬性被修改時檢查。

按照標準,這個[[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規(guī)定了一個內建對象作為所有對象的最終[[prototype]],也就是說即使用{}創(chuàng)建的對象,也會有[[prototype]]指向這個內建對象。

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

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

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

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

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


(請用FF來看結果)


以下為引用的內容:

Function.prototype.prop=1;
alert(Object.prop)
alert(Function.prop)

Object.prototype.prop=1;
alert(Object.prop)
alert(Function.prop)

Function.__proto__.prop=1;
alert(Object.prop)
alert(Function.prop)

function Class(){
}
Class.prototype=Class;
Class.__proto__.prop=1
alert((new Class).prop);

function Class(){}
Class.prototype=Class.__proto__;
Function.prototype.prop=1;
alert((new Class()).prop)

function Class(){
}
Class.prototype.__proto__.prop=1;
Class.prototype=new Class;
alert((new Class).prop);

該文章在 2010/8/17 23:03:19 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業(yè)務管理,結合碼頭的業(yè)務特點,圍繞調度、堆場作業(yè)而開發(fā)的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

嗯嗯热久久| 夫妻性生活网站日本| 二区三区电影院| 黄片区在线| 青青草国产观线2019| 国产激情一区二区三区四区| 龍日韩欧美中文亚洲中文| 日韩无码一二三区图片| 亚洲精品s色| 色诱网视频站免费| WW99久久| 男女操Bn| 综合噜噜久久| 一二三区影院| 会东县| 操大香蕉AV| 艹出水了好厉害啊啊啊一区二区| 麻豆传媒网站免费| av小说手机在线| 羞羞视频在线看免费麻豆| 亚洲字幕九九| 韩日欧美二区| 五月婷婷激情综合在线视频| 激情综合av影院| 乱干视频网站| 黄片一区丶| 亚洲看黄在线电影| 色哟哟—国产精品| 久久久免费视频网站| 人人舔人人插麻豆影视| 亚洲国产精品97久久无色| 国产三级午夜理伦三级三| 色蜜桃久久| 91九色一区二区| 手机观看中文字幕一区二区三区| 99*视频在线| 麻豆人妻少妇无码| 天天天天干天天操一区二区| 国产亚洲色婷婷九九| 想看日韩黄片| 亚洲A级伦理网站|