日本xxxx18视频在线观看-日本xxxx1819-日本xxxwww在线观看-日本xxx-日本xx-日本www在线视频

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

JS技巧:理解JavaScript面向?qū)ο蟮乃悸?/h3>
admin
2010年8月17日 23:3 本文熱度 4153
一般來說大家比較熟悉的面向?qū)ο蠓绞绞腔陬惖拿嫦驅(qū)ο螅暶饕粋€(gè)類,然后在根據(jù)類聲明的描述去創(chuàng)建對(duì)象,通過類與類之間的繼承和組合關(guān)系來復(fù)用代碼。大多數(shù)情況下,基于類的面向?qū)ο笳Z言(C++,C#,Java之類的)都把類整合進(jìn)自己的類型系統(tǒng),即每個(gè)類(Class)同時(shí)也是一個(gè)變量類型(Variable Type),并允許子類類型的值被賦值給父類類型變量。

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

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

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

本來有了這些語法,已經(jīng)可以做基本的面向?qū)ο缶幊塘耍莾H僅如此,JS代碼復(fù)用性比其它語言弱太多。比如,你甚至無法為一組對(duì)象做一個(gè)統(tǒng)一的操作,必須通過循環(huán)遍歷來實(shí)現(xiàn),于是JS引入了原型(prototype),具體的實(shí)現(xiàn)方式是為每個(gè)對(duì)象規(guī)定一個(gè)私有屬性[[prototype]],當(dāng)讀取一個(gè)對(duì)象的屬性時(shí),如果對(duì)象本身沒有這個(gè)屬性,會(huì)嘗試訪問[[prototype]]的相應(yīng)屬性。具體實(shí)現(xiàn)中,[[prototype]]所指向的對(duì)象仍然可以有[[prototype]],實(shí)際的訪問就是一個(gè)鏈?zhǔn)降牟僮鳎钡秸业竭@個(gè)屬性或者[[prototype]]為空為止,所以常常聽到[[prototype]]鏈的說法。為了防止[[prototype]]出現(xiàn)循環(huán),JS引擎會(huì)在任何對(duì)象的[[prototype]]屬性被修改時(shí)檢查。

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


以下為引用的內(nèi)容:

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ī)定了一個(gè)內(nèi)建對(duì)象作為所有對(duì)象的最終[[prototype]],也就是說即使用{}創(chuàng)建的對(duì)象,也會(huì)有[[prototype]]指向這個(gè)內(nèi)建對(duì)象。

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

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

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

這樣對(duì)同一函數(shù)的new運(yùn)算實(shí)際上創(chuàng)建了相似的對(duì)象:擁有共同的原型[[prototype]],被同一函數(shù)處理過。這樣的new運(yùn)算就很類似Class了,同時(shí)由于JS的動(dòng)態(tài)性,所有的"類"在運(yùn)行時(shí)任你宰割,想要模擬繼承之類的行為也就很容易了,由于是弱類型且是動(dòng)態(tài)函數(shù),不存在需要多態(tài)的問題,JS完全可以做到基于類的面向?qū)ο蟆?/DIV>
最后提供幾道題,大家茶余飯后寫完程序不妨做做,都做對(duì)說明你已經(jīng)理解了protype-based javascript


(請(qǐng)用FF來看結(jié)果)


以下為引用的內(nèi)容:

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 編輯過

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

主站蜘蛛池模板: 日韩欧美色射高 | 欧美性xxxxx极品 | 欧美午夜小视频 | 中文一区二区 | 欧美国产在线第75页 | 99久热这 | 国产盗摄不卡 | 日韩欧美制服另类 | 国产日韩欧美综合在线 | 99九九成人| 欧美大黑帍在线播 | 九九在线精品视频 | 精品免费国产一区二区 | 国产高清视频一区三区 | 国产精品777| 国产最新在线视频91 | 国精品产露脸偷拍视频 | 国产精品视频全 | 九九综合九色综合网站 | 国产精品成人免费视频 | 国产永久免费高清在线观看 | 国产午夜福利片在线播放老 | 国内精品自产拍在线观看 | 国语视频动漫高清小说下载以吾 | 国产一区二区三区正品 | 国产无人区码一码二码三mba | 国产激情一区二区三区在线hd | 日韩欧美一区二区高清视频 | 成人黃色一級片 | 国产台湾佬国产娱乐 | 国产欧美一二三区男女交配 | 国产精品尤物在线 | 不卡国产视频第一页 | 欧美日韩一区二区亚洲 | 老司机视频在线www 国产ppp在线视 | 免费很黄很 | 91综合| 日韩视频免 | 欧美日韩国产在线一区二区 | 欧美日韩一级免费 | 韩剧大全免费观看 |