亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JavaScript-面向?qū)ο?、Object類型

amuqiao / 637人閱讀

摘要:面向?qū)ο竺嫦驅(qū)ο缶幊痰娜Q為簡(jiǎn)稱。面向?qū)ο缶幊淌怯贸橄蠓绞絼?chuàng)建基于現(xiàn)實(shí)世界模型的一種編程方式。面向?qū)ο缶幊炭梢钥醋鍪鞘褂靡幌盗袑?duì)象相互協(xié)作的軟件設(shè)計(jì)。面向?qū)ο缶幊痰娜齻€(gè)主要特征是封裝繼承多態(tài)。

面向?qū)ο?/b>

面向?qū)ο缶幊痰娜Q為Object Oriented Programming,簡(jiǎn)稱OOP。面向?qū)ο缶幊淌怯贸橄蠓绞絼?chuàng)建基于現(xiàn)實(shí)世界模型的一種編程方式。
面向?qū)ο缶幊炭梢钥醋鍪鞘褂靡幌盗袑?duì)象相互協(xié)作的軟件設(shè)計(jì)。面向?qū)ο缶幊痰娜齻€(gè)主要特征是:封裝、繼承、多態(tài)。

封裝

所謂封裝就是按照要求使用并得到對(duì)應(yīng)的結(jié)果,而不需要知道真實(shí)的執(zhí)行原理。
封裝主要用于闡述對(duì)象中包含的(封裝的)內(nèi)容,通常有兩部分組成

相關(guān)的數(shù)據(jù)(用于存儲(chǔ)屬性)

基于這些數(shù)據(jù)所能做的事

繼承繼承通常是指類與類之間的關(guān)系。如果兩個(gè)類有相同的屬性或方法,那么可以讓一個(gè)類繼承另一個(gè)類,就不需要再次定義相同的屬性或方法。
創(chuàng)建一個(gè)或多個(gè)類的專門版本類方式稱為繼承(JavaScript只支持單體繼承)。創(chuàng)建的專門版本的類通常叫做子類,另外的類通常叫做父類。

多態(tài)

不同的對(duì)象可以定義相同名稱的方法,方法作用于所在的對(duì)象中。這種不同對(duì)象通過相同方法的調(diào)用實(shí)現(xiàn)各自行為的能力,被稱之為多態(tài)。

構(gòu)造函數(shù)

構(gòu)造函數(shù)又被稱為構(gòu)造器或?qū)ο竽0?,是?duì)象的一個(gè)方法,在實(shí)例化時(shí)構(gòu)造器被調(diào)用。在JavaScript中函數(shù)就可以作為構(gòu)造器使用。

/*  創(chuàng)建構(gòu)造函數(shù)->用于創(chuàng)建對(duì)象
*    function 構(gòu)造函數(shù)名稱(){
*       this.屬性名 = 屬性值
*       this.方法名 = function(){
*           方法體
*           }
*     }
      this關(guān)鍵字指代利用當(dāng)前構(gòu)造函數(shù)創(chuàng)建的對(duì)象*/
function Dog() {//這是構(gòu)造函數(shù),構(gòu)造函數(shù)的屬性和方法使用this關(guān)鍵字
    this.name=function () {
        console.log("哈士奇")
    }
}

/*   利用構(gòu)造函數(shù)創(chuàng)建對(duì)象*/
var dog = new Dog();
console.log(dog);
Object類型 屬性描述符

JavaScript提供了一個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu),用于描述對(duì)象的值,控制其行為,例如該屬性是否可寫,是否可配置,是否可刪除,是否可枚舉等,這個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu)被稱為屬性描述符。
對(duì)象里目前存在的屬性描述符主要有兩種形式:數(shù)據(jù)描述符和存取描述符。

數(shù)據(jù)描述符

數(shù)據(jù)描述符是一個(gè)具有值的屬性,該值可能是可寫的,也可能是不可寫的。數(shù)據(jù)描述符具有以下可選鍵值:

value:該屬性對(duì)應(yīng)的值??梢允侨魏斡行У腏avaScript值。默認(rèn)為undefined、

writable:當(dāng)且僅當(dāng)屬性的writable為true時(shí),value才能被賦值運(yùn)算符改變。默認(rèn)為false。

configurable:當(dāng)且僅當(dāng)該屬性的configurable為true時(shí),該屬性描述符才能被改變,同時(shí)該屬性也能從對(duì)應(yīng)的對(duì)象上被刪除。默認(rèn)為false。

enumerable:當(dāng)且僅當(dāng)該屬性的enumerable為true時(shí),該屬性才能夠出現(xiàn)在對(duì)象的枚舉屬性中,默認(rèn)為false。

存取描述符

存取描述符是由getter-setter函數(shù)對(duì)描述的屬性。有以下可選鍵值

get:給屬性提供getter的方法,如果沒有g(shù)etter則為undefined。當(dāng)訪問該屬性時(shí),該方法會(huì)被執(zhí)行,方法執(zhí)行時(shí)沒有參數(shù)傳入,但是會(huì)傳入this對(duì)象。

set:給屬性提供setter的方法,如果沒有setter則為undefined。當(dāng)屬性修改時(shí),觸發(fā)執(zhí)行該方法。該方法接受唯一參數(shù),即改屬性新的參數(shù)值。

configurable:當(dāng)且僅當(dāng)該屬性的configurable為true時(shí),該屬性描述符才能被改變,同時(shí)該屬性也能從對(duì)應(yīng)的對(duì)象上被刪除。默認(rèn)為false。

enumerable:當(dāng)且僅當(dāng)該屬性的enumerable為true時(shí),該屬性才能夠出現(xiàn)在對(duì)象的枚舉屬性中,默認(rèn)為false。

獲取屬性描述符

Object.getOwnPropentyDescriptor()方法返回指定對(duì)象上一個(gè)自有屬性對(duì)應(yīng)的屬性描述符

var obj = {
    name : "哈士奇"
}
/*
    使用Object.getOwnPropertyDescriptor()方法獲取指定屬性的描述符
    Object.getOwnPropertyDescriptor(obj,prop)
    * obj - 表示指定屬性對(duì)應(yīng)的目標(biāo)對(duì)象
    * prop - 表示獲取描述符的目標(biāo)屬性名稱
    * 返回值 - 其屬性描述符對(duì)象
    * 如果
  */
var v =Object.getOwnPropertyDescriptor(obj,"name");
console.log(v)
設(shè)置屬性描述符可選鍵值value

Object.deginepropety()方法為對(duì)象定義新屬性或修改現(xiàn)有屬性,并返回該對(duì)象。

var obj ={//定義對(duì)象時(shí)定義的屬性是可以修改、刪除、枚舉的
    name : "阿拉斯加"
}
/*
    Object.defineProperty(obj, prop, descriptor)方法
    * 作用
      * 用于定義目標(biāo)對(duì)象的新屬性
      * 用于修改目標(biāo)對(duì)象的已存在屬性
    * 參數(shù)
      * obj - 表示目標(biāo)對(duì)象
      * prop - 表示目標(biāo)對(duì)象的目標(biāo)屬性名稱
      * descriptor - 表示屬性描述符,必須是對(duì)象格式
        {
            value : 值
        }
    * 返回值 - 返回傳遞的對(duì)象
 */
//修改name屬性
Object.defineProperty(obj, "name",{
    value:"哈士奇"
} );
console.log(obj.name);//哈士奇

/*
    同樣都是為對(duì)象新增屬性
    1.如果直接使用 "對(duì)象名.屬性名 = 值" -> 可修改、可刪除以及可枚舉的
    2.如果使用Object.defineProperty()方法新增屬性
      * 該新屬性是不可修改、不可刪除以及不可枚舉的
 */
//新增age屬性//用該方法新增的屬性默認(rèn)是不可以修改、刪除、枚舉的
Object.defineProperty(obj,"age",{
    value : 2
});

Object.degineproperties()方法為對(duì)象定義一個(gè)或多個(gè)新屬性或修改現(xiàn)有屬性,并返回該值。

設(shè)置屬性描述符可選鍵值weitable
var obj = {
    // 定義對(duì)象的同時(shí)定義了該屬性以及值(可修改、可刪除以及可枚舉的)
    name : "張無忌"
}
// 修改現(xiàn)有屬性
Object.defineProperty(obj, "name", {
    value : "周芷若",
    writable : false // 不可修改
});
console.log(obj.name);// 周芷若
// 修改name屬性值
obj.name = "趙敏";
console.log(obj.name);// 周芷若

Object.defineProperty(obj, "age", {
   value : 18,
   writable : true
});
console.log(obj.age);// 18
// 修改age屬性值
obj.age = 80;
console.log(obj.age);// 80

設(shè)置屬性描述符可選鍵值configuarble

var obj = {
    // 定義對(duì)象的同時(shí)定義了該屬性以及值(可修改、可刪除以及可枚舉的)
    name : "張無忌"
}
// 修改現(xiàn)有屬性
Object.defineProperty(obj, "name", {
    value : "周芷若",
    writable : true, // 控制當(dāng)前屬性是否可被修改
    configurable : true // 控制當(dāng)前屬性是否可被刪除
});
console.log(obj.name);// 周芷若
// 修改name屬性值
obj.name = "趙敏";
console.log(obj.name);// 趙敏
// 刪除name屬性值
delete obj.name;undefined
console.log(obj.name);// undefined
設(shè)置屬性描述符enumerable
var obj = {
    // 定義對(duì)象的同時(shí)定義了該屬性以及值(可修改、可刪除以及可枚舉的)
    name : "張無忌"
}
Object.defineProperty(obj, "name", {
    value : "周芷若",
    enumerable : false
});
console.log(obj.name);// 周芷若
/*
    屬性描述符enumerable - 控制當(dāng)前屬性是否可被枚舉(遍歷)
    * 僅能循環(huán)遍歷對(duì)象中可被枚舉的屬性
      * for...in語句
      * keys()方法
    * 可以循環(huán)遍歷對(duì)象中可被枚舉和不可被枚舉的屬性
      * getOwnPropertyNames()方法
 */
for (var i in obj) {
    console.log(i);
}
var result1 = Object.keys(obj);
console.log(result1);
var result2 = Object.getOwnPropertyNames(obj);
console.log(result2);
設(shè)置屬性描述符存取器

對(duì)象中的屬性除了可以直接定義外,還可以用存取器進(jìn)行定義。setter為取值函數(shù),使用屬性描述符中的set;getter為取值函數(shù),使用屬性描述符中的get。

var value;
var obj = {
    // 存取描述符中的get
    get attr() {// 表示當(dāng)前目標(biāo)屬性名稱
        return value;
    },
    // 存取描述符中的set
    set attr(newValue) {// 表示當(dāng)前目標(biāo)屬性名稱
        console.log("setter: " + newValue);
        value = newValue;
    }
}
console.log(obj.attr);// undefined
obj.attr = 100;// "setter: 100"
防篡改對(duì)象

定義的對(duì)象默認(rèn)在任何時(shí)候任何位置都可以隨意修改,所以添加了防止篡改的機(jī)制分為三個(gè)級(jí)別

禁止擴(kuò)展:禁止為對(duì)象擴(kuò)展新的屬性和方法

密封對(duì)象:只允許讀寫屬性的值

凍結(jié)對(duì)象:禁止任何操作

禁止擴(kuò)展

Object.preventExtensions()設(shè)置指定對(duì)象不可擴(kuò)展

Object.isExtensible()判斷一個(gè)對(duì)象是否可以擴(kuò)展

密封對(duì)象

Objet.seal()方法用于密封一個(gè)對(duì)象,防止添加新屬性并將現(xiàn)有屬性標(biāo)記為不可配置,當(dāng)前屬性的值可寫。

Object.Sealead()判斷對(duì)象是否被密封

凍結(jié)對(duì)象

Object.freeze()用于凍結(jié)一個(gè)對(duì)象,無法對(duì)這個(gè)對(duì)象進(jìn)行任何操作,只可讀

Object.isFrozen()判斷對(duì)象是否被凍結(jié)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/108198.html

相關(guān)文章

  • JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐 | 01 - 面向對(duì)象JavaScript

    摘要:在中,并沒有對(duì)抽象類和接口的支持。例如,當(dāng)對(duì)象需要對(duì)象的能力時(shí),可以有選擇地把對(duì)象的構(gòu)造器的原型指向?qū)ο?,從而達(dá)到繼承的效果。本節(jié)內(nèi)容為設(shè)計(jì)模式與開發(fā)實(shí)踐第一章筆記。 動(dòng)態(tài)類型語言 編程語言按數(shù)據(jù)類型大體可以分為兩類:靜態(tài)類型語言與動(dòng)態(tài)類型語言。 靜態(tài)類型語言在編譯時(shí)已確定變量類型,動(dòng)態(tài)類型語言的變量類型要到程序運(yùn)行時(shí),待變量被賦值后,才具有某種類型。 而JavaScript是一門典型...

    suxier 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你的“對(duì)象”還好嗎?

    摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來。注意中,對(duì)象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    李昌杰 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你的“對(duì)象”還好嗎?

    摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來。注意中,對(duì)象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    Lyux 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你的“對(duì)象”還好嗎?

    摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來。注意中,對(duì)象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    AaronYuan 評(píng)論0 收藏0
  • 理清javascript中的面向對(duì)象(一)——原型繼承

    摘要:有一函數(shù)若是用來生成對(duì)象,則稱為構(gòu)造函數(shù)名。屬性指定了使用該構(gòu)造函數(shù)生成的對(duì)象實(shí)例繼承了哪個(gè)對(duì)象實(shí)例。因此,只要利用,就能在構(gòu)造函數(shù)中,為未來利用此構(gòu)造函數(shù)生成的對(duì)象實(shí)例,添加成員屬性和成員方法了。 與其它編程語言不一樣的是,javascript的面向?qū)ο蟛⒎且蕾囉诔橄蟮念悾峭ㄟ^原型鏈,將一個(gè)個(gè)具體的對(duì)象實(shí)例進(jìn)行連接,位于原型鏈下游的對(duì)象實(shí)例可以讀取/使用位于上游的對(duì)象實(shí)例的屬性/...

    beita 評(píng)論0 收藏0
  • 面向對(duì)象JavaScript(如何一步步成為js高手)

    摘要:雖然,也是面向疾苦的語言,但是,它和靜態(tài)類型語言的面向接口編程不一而足。對(duì)象對(duì)他自己的行為負(fù)責(zé),其他對(duì)象不關(guān)心它的內(nèi)部實(shí)現(xiàn)。 ‘工欲善其事,必先利其器’,在深入學(xué)習(xí)JavaScript之前,我認(rèn)為我們很有必要了解以下,JavaScript這門面向?qū)ο蟮膭?dòng)態(tài)語言到底是一門什么樣的語言。 JavaScript vs 其他面向?qū)ο笳Z言 它沒有使用像Java等傳統(tǒng)的面向?qū)ο笳Z言的類式繼承,而...

    peixn 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

amuqiao

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<