摘要:面向?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)建的專門版本的類通常叫做子類,另外的類通常叫做父類。
不同的對象可以定義相同名稱的方法,方法作用于所在的對象中。這種不同對象通過相同方法的調(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ù)描述符具有以下可選鍵值:
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)有屬性,并返回該值。
設置屬性描述符可選鍵值weitablevar 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
摘要:在中,并沒有對抽象類和接口的支持。例如,當對象需要對象的能力時,可以有選擇地把對象的構(gòu)造器的原型指向?qū)ο?,從而達到繼承的效果。本節(jié)內(nèi)容為設計模式與開發(fā)實踐第一章筆記。 動態(tài)類型語言 編程語言按數(shù)據(jù)類型大體可以分為兩類:靜態(tài)類型語言與動態(tài)類型語言。 靜態(tài)類型語言在編譯時已確定變量類型,動態(tài)類型語言的變量類型要到程序運行時,待變量被賦值后,才具有某種類型。 而JavaScript是一門典型...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:有一函數(shù)若是用來生成對象,則稱為構(gòu)造函數(shù)名。屬性指定了使用該構(gòu)造函數(shù)生成的對象實例繼承了哪個對象實例。因此,只要利用,就能在構(gòu)造函數(shù)中,為未來利用此構(gòu)造函數(shù)生成的對象實例,添加成員屬性和成員方法了。 與其它編程語言不一樣的是,javascript的面向?qū)ο蟛⒎且蕾囉诔橄蟮念?,而是通過原型鏈,將一個個具體的對象實例進行連接,位于原型鏈下游的對象實例可以讀取/使用位于上游的對象實例的屬性/...
摘要:雖然,也是面向疾苦的語言,但是,它和靜態(tài)類型語言的面向接口編程不一而足。對象對他自己的行為負責,其他對象不關心它的內(nèi)部實現(xiàn)。 ‘工欲善其事,必先利其器’,在深入學習JavaScript之前,我認為我們很有必要了解以下,JavaScript這門面向?qū)ο蟮膭討B(tài)語言到底是一門什么樣的語言。 JavaScript vs 其他面向?qū)ο笳Z言 它沒有使用像Java等傳統(tǒng)的面向?qū)ο笳Z言的類式繼承,而...
閱讀 1775·2021-11-22 12:09
閱讀 1479·2019-08-30 13:22
閱讀 2110·2019-08-29 17:00
閱讀 2657·2019-08-29 16:28
閱讀 2974·2019-08-26 13:51
閱讀 1201·2019-08-26 13:25
閱讀 3260·2019-08-26 12:14
閱讀 3031·2019-08-26 12:14