国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript-面向對象、Object類型

amuqiao / 571人閱讀

摘要:面向對象面向對象編程的全稱為簡稱。面向對象編程是用抽象方式創建基于現實世界模型的一種編程方式。面向對象編程可以看做是使用一系列對象相互協作的軟件設計。面向對象編程的三個主要特征是封裝繼承多態。

面向對象

面向對象編程的全稱為Object Oriented Programming,簡稱OOP。面向對象編程是用抽象方式創建基于現實世界模型的一種編程方式。
面向對象編程可以看做是使用一系列對象相互協作的軟件設計。面向對象編程的三個主要特征是:封裝、繼承、多態。

封裝

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

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

基于這些數據所能做的事

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

多態

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

構造函數

構造函數又被稱為構造器或對象模板,是對象的一個方法,在實例化時構造器被調用。在JavaScript中函數就可以作為構造器使用。

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

/*   利用構造函數創建對象*/
var dog = new Dog();
console.log(dog);
Object類型 屬性描述符

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

數據描述符

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

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

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

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

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

存取描述符

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

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

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

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

enumerable:當且僅當該屬性的enumerable為true時,該屬性才能夠出現在對象的枚舉屬性中,默認為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()方法為對象定義新屬性或修改現有屬性,并返回該對象。

var obj ={//定義對象時定義的屬性是可以修改、刪除、枚舉的
    name : "阿拉斯加"
}
/*
    Object.defineProperty(obj, prop, descriptor)方法
    * 作用
      * 用于定義目標對象的新屬性
      * 用于修改目標對象的已存在屬性
    * 參數
      * 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()方法為對象定義一個或多個新屬性或修改現有屬性,并返回該值。

設置屬性描述符可選鍵值weitable
var obj = {
    // 定義對象的同時定義了該屬性以及值(可修改、可刪除以及可枚舉的)
    name : "張無忌"
}
// 修改現有屬性
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 : "張無忌"
}
// 修改現有屬性
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 - 控制當前屬性是否可被枚舉(遍歷)
    * 僅能循環遍歷對象中可被枚舉的屬性
      * for...in語句
      * keys()方法
    * 可以循環遍歷對象中可被枚舉和不可被枚舉的屬性
      * 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為取值函數,使用屬性描述符中的set;getter為取值函數,使用屬性描述符中的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"
防篡改對象

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

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

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

凍結對象:禁止任何操作

禁止擴展

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

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

密封對象

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

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

凍結對象

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108198.html

相關文章

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

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

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

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

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

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

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

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

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

    摘要:有一函數若是用來生成對象,則稱為構造函數名。屬性指定了使用該構造函數生成的對象實例繼承了哪個對象實例。因此,只要利用,就能在構造函數中,為未來利用此構造函數生成的對象實例,添加成員屬性和成員方法了。 與其它編程語言不一樣的是,javascript的面向對象并非依賴于抽象的類,而是通過原型鏈,將一個個具體的對象實例進行連接,位于原型鏈下游的對象實例可以讀取/使用位于上游的對象實例的屬性/...

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

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

    peixn 評論0 收藏0

發表評論

0條評論

amuqiao

|高級講師

TA的文章

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