中文字幕在线一区二区在线,久久久精品免费观看国产,无码日日模日日碰夜夜爽,天堂av在线最新版在线,日韩美精品无码一本二本三本,麻豆精品三级国产国语,精品无码AⅤ片,国产区在线观看视频

      javascript的面向?qū)ο蠹夹g(shù)介紹

      時(shí)間:2024-07-29 09:30:46 JavaScript 我要投稿
      • 相關(guān)推薦

      javascript的面向?qū)ο蠹夹g(shù)介紹

        javascript中的對象還沒解釋清楚怎么回事,一上來就直奔主題,類/繼承/原型/私有變量....

        結(jié)果呢,看了大半天,有了一個(gè)大概的了解,細(xì)細(xì)一回味,好像什么都沒懂...

        這篇文章是參考<>第7,8,9章而寫成的,我也會盡量按照原書的結(jié)構(gòu)來說明javascript的面向?qū)ο蠹夹g(shù)(對象/數(shù)組->函數(shù)-->類/構(gòu)造函數(shù)/原型).對一些我自己也拿捏不準(zhǔn)的地方,我會附上原文的英文語句,供大家參考.

        如果不做說明,則文中出現(xiàn)的所有英文語句(程序體除外)都是引自<>.

        -------------------------------------------------

        對象和數(shù)組(Objects and Arrays)

        什么是對象?把一些"名字-屬性"的組合放在一個(gè)單元里面,就組成了一個(gè)對象.我們可以理解為javascript中

        的對象就是一些"鍵-值"對的集合(An object is a collection of named values. These named values are usually referred

        to as properties of the object.--Section3.5).

        "名字"只能是string類型,不能是其他類型,而屬性的類型則是任意的(數(shù)字/字符串/其他對象..).可以用new Object()來創(chuàng)建一個(gè)空對象,也可以簡單的用"{}"來創(chuàng)建一個(gè)空對象,這兩者的作用是等同的.

        Js代碼

        復(fù)制代碼 代碼如下:

        var emptyObject1 = {}; //創(chuàng)建空對象

        var emptyObject2 = new Object(); //創(chuàng)建空對象

        var person = {"name":"sdcyst",

        "age":18,

        "sex":"male"}; //創(chuàng)建一個(gè)包含初始值的對象person

        alert(person.name); //sdcyst

        alert(person["age"]); //18

        從上面的例子我們也可以看到,訪問一個(gè)對象的屬性,可以簡單的用對象名加"."后加屬性的名字,也可以用"[]"操作符來獲取,此時(shí)在[]里面的屬性名字要加引號,這是因?yàn)閷ο笾械乃饕际亲址愋偷?

        javasript對象中屬性的個(gè)數(shù)是可變的,在創(chuàng)建了一個(gè)對象之后可以隨時(shí)對它賦予任何的屬性.

        Js代碼

        復(fù)制代碼 代碼如下:

        var person = {};

        person.name = "sdcyst";

        person["age"] = 18;

        alert(person.name + "__" + person.age); //sdcyst__18

        var _person = {name:"balala","age":23}; //在構(gòu)建一個(gè)對象時(shí),屬性的名字可以不用引號來標(biāo)注(name),//但是仍舊是一個(gè)字符串類型.在訪問的時(shí)候[]內(nèi)仍舊需要引號

        alert(_person["name"] + "__" + person.age); //balala__23

        alert(_person[name]); //undefinied

        通過"."操作符獲取對象的屬性,必須得知道屬性的名字.一般來說"[]"操作符獲取對象屬性的功能更強(qiáng)大一些,可以在[]中放入一些表達(dá)式來取屬性的值,比如可以用在循環(huán)控制語句中,而"."操作符則沒有這種靈活性。

        Js代碼

        復(fù)制代碼 代碼如下:

        var name = {"name1":"NAME1","name2":"NAME2","name3":"NAME3","name4":"NAME4"};

        var namestring = "";

        for(var props in name) { //循環(huán)name對象中的屬性名字

        namestring += name[props];

        }

        alert(namestring); //NAME1NAME2NAME3NAME4

        namestring = "";

        for(var i=0; i<4; i++) {

        namestring += name["name"+(i+1)];

        }

        alert(namestring); //NAME1NAME2NAME3NAME4

        操作符可以刪除對象中的某個(gè)屬性,判斷某個(gè)屬性是否存在可以使用"in"操作符.

        Js代碼

        復(fù)制代碼 代碼如下:

        var name = {"name1":"NAME1","name2":"NAME2","name3":"NAME3","name4":"NAME4"};

        var namestring = "";

        for(var props in name) { //循環(huán)name對象中的屬性名字

        namestring += name[props];

        }

        alert(namestring); //NAME1NAME2NAME3NAME4

         name.name1; //刪除name1屬性

         name["name3"]; //刪除name3屬性

        namestring = "";

        for(var props in name) { //循環(huán)name對象中的屬性名字

        namestring += name[props];

        }

        alert(namestring); //NAME2NAME4

        alert("name1" in name); //false

        alert("name4" in name); //true

        需要注意,對象中的屬性是沒有順序的.

        對象的constructor屬性

        每一個(gè)javascript對象都有一個(gè)constructor屬性.這個(gè)屬性對應(yīng)了對象初始化時(shí)的構(gòu)造函數(shù)(函數(shù)也是對象).

        Js代碼

        復(fù)制代碼 代碼如下:

        var date = new Date();

        alert(date.constructor); //Date

        alert(date.constructor == "Date"); //false

        alert(date.constructor == Date); //true

        數(shù)組

        我們已經(jīng)提到過,對象是無序數(shù)據(jù)的集合,而數(shù)組則是有序數(shù)據(jù)的集合,數(shù)組中的數(shù)據(jù)(元素)通過索引(從0開始)來訪問,

        數(shù)組中的數(shù)據(jù)可以是任何的數(shù)據(jù)類型.數(shù)組本身仍舊是對象,但是由于數(shù)組的很多特性,通常情況下把數(shù)組和對象區(qū)別

        開來分別對待(Throughout this book, objects and arrays are often treated as distinct datatypes.

        This is a useful and reasonable simplification; you can treat objects and arrays as separate types

        for most of your JavaScript programming.To fully understand the behavior of objects and arrays,

        however, you have to know the truth: an array is nothing more than an object with a thin layer of extra

        functionality. You can see this with the typeof operator: applied to an array value, it returns

        the string "object". --section7.5).

        創(chuàng)建數(shù)組可以用"[]"操作符,或者是用Array()構(gòu)造函數(shù)來new一個(gè).

        復(fù)制代碼 代碼如下:

        var array1 = []; //創(chuàng)建空數(shù)組

        var array2 = new Array(); //創(chuàng)建空數(shù)組

        array1 = [1,"s",[3,4],{"name1":"NAME1"}]; //

        alert(array1[2][1]); //4 訪問數(shù)組中的數(shù)組元素

        alert(array1[3].name1); //NAME1 訪問數(shù)組中的對象

        alert(array1[8]); //undefined

        array2 = [,,]; //沒有數(shù)值填入只有逗號,則對應(yīng)索引處的元素為undefined

        alert(array2.length); //3

        alert(array2[1]); //undefined

        用new Array()來創(chuàng)建數(shù)組時(shí),可以指定一個(gè)默認(rèn)的大小,其中的值此時(shí)為undefined,以后可以再給他們賦值.但是由于

        javascript中的數(shù)組的長度是可以任意改變的,同時(shí)數(shù)組中的內(nèi)容也是可以任意改變的,因此這個(gè)初始化的長度實(shí)際上

        對數(shù)組沒有任何的約束力.對于一個(gè)數(shù)組,如果對超過它最大長度的索引賦值,則會改變數(shù)組的長度,同時(shí)會對沒有賦值

        的索引處賦值undefined,看下面的例子.

        復(fù)制代碼 代碼如下:

        var array = new Array(10);

        alert(array.length); //10

        alert(array[4]); //undefined

        array[100] = "100th"; //這個(gè)操作會改變數(shù)組的長度,同時(shí)將10-99索引對應(yīng)的值設(shè)為undefined

        alert(array.length); //101

        alert(array[87]); //undefined

        可以用操作符刪除數(shù)組的元素,注意這個(gè)刪除僅僅是將數(shù)組在該位置的元素設(shè)為undefined,數(shù)組的長度并沒有改變.

        我們已經(jīng)使用過了數(shù)組的length屬性,length屬性是一個(gè)可以讀/寫的屬性,也就是說我們可以通過改變數(shù)組的length屬性來

        任意的改變數(shù)組的長度.如果將length設(shè)為小于數(shù)組長度的值,則原數(shù)組中索引大于length-1的值都會被刪除.如果length

        的值大于原始數(shù)組的長度,則在它們之間的值設(shè)為undefined.

        復(fù)制代碼 代碼如下:

        var array = new Array("n1","n2","n3","n4","n5"); //五個(gè)元素的數(shù)組

        var astring = "";

        for(var i=0; i<array.length; i++) { //循環(huán)數(shù)組元素

        astring += array[i];

        }

        alert(astring); //n1n2n3n4n5

         array[3]; //刪除數(shù)組元素的值

        alert(array.length + "_" + array[3]) //5_undefined

        array.length = 3; //縮減數(shù)組的長度

        alert(array[3]); //undefined

        array.length = 8; //擴(kuò)充數(shù)組的長度

        alert(array[4]); //undefined

        對于數(shù)組的其他方法諸如join/reverse等等,在這就不再一一舉例.

        通過上面的解釋,我們已經(jīng)知道,對象的屬性值是通過屬性的名字(字符串類型)來獲取,而數(shù)組的元素是通過索

        引(整數(shù)型 0~~2**32-1)來得到值.數(shù)組本身也是一個(gè)對象,所以對象屬性的操作也完全適合于數(shù)組.

        復(fù)制代碼 代碼如下:

        var array = new Array("no1","no2");

        array["po"] = "props1";

        alert(array.length); //2

        //對于數(shù)組來說,array[0]同array["0"]效果是一樣的(?不確定,測試時(shí)如此)

        alert(array[0] + "_" + array["1"] + "_" + array.po);//no1_no2_props1

        數(shù)組也是對象,所以數(shù)組可以有自己的屬性,但是屬性和值不是一個(gè)概念,"no1"和"no2"都是數(shù)組的值,而array["po"]是給數(shù)組添加了一個(gè)屬性,其長度當(dāng)然就沒變了。

        函數(shù)

        javascript函數(shù)相信大家都寫過不少了,所以我們這里只是簡單介紹一下.

        創(chuàng)建函數(shù):

        function f(x) {........}

        var f = function(x) {......}

        上面這兩種形式都可以創(chuàng)建名為f()的函數(shù),不過后一種形式可以創(chuàng)建匿名函數(shù)

        函數(shù)定義時(shí)可以設(shè)置參數(shù),如果傳給函數(shù)的參數(shù)個(gè)數(shù)不夠,則從最左邊起依次對應(yīng),其余的用undefined賦值,如果傳給函數(shù)

        的參數(shù)多于函數(shù)定義參數(shù)的個(gè)數(shù),則多出的參數(shù)被忽略.

        復(fù)制代碼 代碼如下:

        function myprint(s1,s2,s3) {

        alert(s1+"_"+s2+"_"+s3);

        }

        myprint(); //undefined_undefined_undefined

        myprint("string1","string2"); //string1_string2_undefined

        myprint("string1","string2","string3","string4"); //string1_string2_string3

        因此,對于定義好的函數(shù),我們不能指望調(diào)用者將所有的參數(shù)全部傳進(jìn)來.對于那些必須用到的參數(shù)應(yīng)該在函數(shù)體中

        加以檢測(用!操作符),或者設(shè)置默認(rèn)值然后同參數(shù)進(jìn)行或(||)操作來取得參數(shù).

        復(fù)制代碼 代碼如下:

        function myprint(s1,person) {

        var defaultperson = { //默認(rèn)person對象

        "name":"name1",

        "age":18,

        "sex":"female"

        };

        if(!s1) { //s1不允許為空

        alert("s1 must be input!");

        return false;

        }

        person = person || defaultperson; //接受person對象參數(shù)

        alert(s1+"_"+person.name+":"+person.age+":"+person.sex);

        };

        myprint(); //s1 must be input!

        myprint("s1"); //s1_name1:18:female

        myprint("s1",{"name":"sdcyst","age":23,"sex":"male"}); //s1_sdcyst:23:male

        函數(shù)的arguments屬性

        在每一個(gè)函數(shù)體的內(nèi)部,都有一個(gè)arguments標(biāo)識符,這個(gè)標(biāo)識符代表了一個(gè)Arguments對象.Arguments對象非常類似

        于Array(數(shù)組)對象,比如都有l(wèi)ength屬性,訪問它的值用"[]"操作符利用索引來訪問參數(shù)值,但是,二者是完全不同的

        東西,僅僅是表面上有共同點(diǎn)而已(比如說修改Arguments對象的length屬性并不會改變它的長度).

        復(fù)制代碼 代碼如下:

        function myargs() {

        alert(arguments.length);

        alert(arguments[0]);

        }

        myargs(); //0 --- undefined

        myargs("1",[1,2]); //2 --- 1

        Arguments對象有一個(gè)callee屬性,標(biāo)示了當(dāng)前Arguments對象所在的方法.可以使用它來實(shí)現(xiàn)匿名函數(shù)的內(nèi)部遞歸調(diào)用.

        復(fù)制代碼 代碼如下:

        function(x) {

        if (x <= 1) return 1;

        return x * arguments.callee(x-1);

        } (section8.2)

        Method--方法

        方法就是函數(shù).我們知道,每一個(gè)對象都包含0個(gè)或多個(gè)屬性,屬性可以是任意類型,當(dāng)然也包括對象.函數(shù)本身就是一種

        對象,因此我們完全可以把一個(gè)函數(shù)放到一個(gè)對象里面,此時(shí),這個(gè)函數(shù)就成了對象的一個(gè)方法.此后如果要使用該方法,

        則可以通過對象名利用"."操作符來實(shí)現(xiàn).

        復(fù)制代碼 代碼如下:

        var obj = {f0:function(){alert("f0");}}; //對象包含一個(gè)方法

        function f1() {alert("f1");}

        obj.f1 = f1; //為對象添加方法

        obj.f0(); //f0 f0是obj的方法

        obj.f1(); //f1 f1是obj的方法

        f1(); //f1 f1同時(shí)又是一個(gè)函數(shù),可以直接調(diào)用

        f0(); //f0僅僅是obj的方法,只能通過對象來調(diào)用

        方法的調(diào)用需要對象的支持,那么在方法中如何獲取對象的屬性呢?this!this關(guān)鍵字我們已經(jīng)很熟悉了,在javascript的方

        法中,我們可以用this來取得對方法調(diào)用者(對象)的引用,從而獲取方法調(diào)用者的各種屬性.

        復(fù)制代碼 代碼如下:

        var obj = {"name":"NAME","sex":"female"};

        obj.print = function() { //為對象添加方法

        alert(this.name + "_" + this["sex"]);

        };

        obj.print(); //NAME_female

        obj.sex = "male";

        obj.print(); //NAME_male

        下面我們來一個(gè)更加面向?qū)ο蟮睦?

        復(fù)制代碼 代碼如下:

        var person = {name:"defaultname",

        setName:function(s){

        this.name = s;

        },

        "printName":function(){

        alert(this.name);

        }}

        person.printName(); //defaultname

        person.setName("newName");

        person.printName(); //newName

        在上面的例子中,完全可以用person.name=..來直接改變person的name屬性,在此我們只是為了展示一下剛才提到的內(nèi)容.

        另一種改變person屬性的方法就是:定義一個(gè)function,接收兩個(gè)參數(shù),一個(gè)是person,一個(gè)是name的值,看起來像是這樣:

        changeName(person,"newName").哪種方法好呢?很明顯,例子中的方法更形象,更直觀一些,而且好像有了那么一點(diǎn)面向

        對象的影子.

        再次強(qiáng)調(diào)一下,方法(Method)本身就是是函數(shù)(function),只不過方法的使用更受限制.在后面的篇幅中,如果提到函數(shù),那么

        提到的內(nèi)容同樣適用于方法,反之則不盡然.

      【javascript的面向?qū)ο蠹夹g(shù)介紹】相關(guān)文章:

      javascript克隆對象深度介紹07-25

      JavaScript中的三種對象10-24

      使用ajax操作JavaScript對象的方法09-28

      關(guān)于javascript對象之內(nèi)置和對象Math的使用方法10-08

      PHP面向?qū)ο笾剌d重寫的不同10-25

      JavaScript高級程序設(shè)計(jì):本地對象Array10-22

      Javascript中arguments對象的詳解和使用方法08-20

      2016年java面向?qū)ο缶幊填}庫及答案10-24

      主站蜘蛛池模板: 国产精品va在线观看一| 色婷婷色99国产综合精品| 安溪县| 精品一区二区三区影片| 少妇精品一区二区三区免费| 久久中精品中文字幕入口| 阳泉市| 定陶县| 免费视频这里是精品视频 | 岛国av网站在线播放| 和平县| 尼勒克县| 91九色系列视频在线国产| 欧美在线成人免费国产| 久分夜色精品国产噜噜亚洲av| 免费国产一级片内射老| 久久久精品国产亚洲麻色欲| 国产小视频一区二区三区| 承德市| 亚洲色欲色欲大片WWW无码 | 手机av男人天堂免费网址| 在线视频不卡在线亚洲| 在线观看国产内射视频| 亚洲www视频| 一区二区中文字幕视频| 无码免费午夜福利片在线| 欧美激情国产亚州一区二区| 久久精品中文字幕久久| 亚洲色婷婷综合开心网| 国产成人精品aaaa视频一区| 国产伦码精品一区二区| 成年大片免费视频观看| 国产在线天堂av| 亚洲天堂免费一二三四区| 久久精品亚洲精品毛片| 蜜桃av区一区二区三| 丝袜熟女视频九色一区91| 亚洲中文字幕精品久久久久久直播| 91情侣在线精品国产免费| 国产丝袜美腿美女视频| 咸阳市|