成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript-面向?qū)ο蟆bject類型

amuqiao / 616人閱讀

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

面向?qū)ο?/b>

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

封裝

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

相關的數(shù)據(jù)(用于存儲屬性)

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

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

多態(tài)

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

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

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

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

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

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

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

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

value:該屬性對應的值。可以是任何有效的JavaScript值。默認為undefined、

writable:當且僅當屬性的writable為true時,value才能被賦值運算符改變。默認為false。

configurable:當且僅當該屬性的configurable為true時,該屬性描述符才能被改變,同時該屬性也能從對應的對象上被刪除。默認為false。

enumerable:當且僅當該屬性的enumerable為true時,該屬性才能夠出現(xiàn)在對象的枚舉屬性中,默認為false。

存取描述符

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

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

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

configurable:當且僅當該屬性的configurable為true時,該屬性描述符才能被改變,同時該屬性也能從對應的對象上被刪除。默認為false。

enumerable:當且僅當該屬性的enumerable為true時,該屬性才能夠出現(xiàn)在對象的枚舉屬性中,默認為false。

獲取屬性描述符

Object.getOwnPropentyDescriptor()方法返回指定對象上一個自有屬性對應的屬性描述符

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

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

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

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

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

設置屬性描述符可選鍵值weitable
var obj = {
    // 定義對象的同時定義了該屬性以及值(可修改、可刪除以及可枚舉的)
    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

設置屬性描述符可選鍵值configuarble

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

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

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

定義的對象默認在任何時候任何位置都可以隨意修改,所以添加了防止篡改的機制分為三個級別

禁止擴展:禁止為對象擴展新的屬性和方法

密封對象:只允許讀寫屬性的值

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

禁止擴展

Object.preventExtensions()設置指定對象不可擴展

Object.isExtensible()判斷一個對象是否可以擴展

密封對象

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

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

凍結(jié)對象

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

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

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/108198.html

相關文章

  • JavaScript設計模式與開發(fā)實踐 | 01 - 面向對象JavaScript

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

    suxier 評論0 收藏0
  • SegmentFault 技術周刊 Vol.32 - 七夕將至,你的“對象”還好嗎?

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

    李昌杰 評論0 收藏0
  • SegmentFault 技術周刊 Vol.32 - 七夕將至,你的“對象”還好嗎?

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

    Lyux 評論0 收藏0
  • SegmentFault 技術周刊 Vol.32 - 七夕將至,你的“對象”還好嗎?

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

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

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

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

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

    peixn 評論0 收藏0

發(fā)表評論

0條評論

amuqiao

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<