摘要:一面向?qū)ο蟾攀雒嫦驅(qū)ο笫鞘裁词鞘褂靡幌盗袑?duì)象相互協(xié)作軟件設(shè)計(jì),目的是在編程中促進(jìn)更好靈活性和可維護(hù)性,憑借對(duì)模塊化重視,面向?qū)ο蟠a開(kāi)發(fā)更簡(jiǎn)單,容易理解面向?qū)ο蟮挠兄饕卣魇欠庋b繼承多態(tài)封裝封裝主要用于敘述對(duì)象中所包含封裝的內(nèi)容,由兩部分組
JS(JavaScript)
一.面向?qū)ο螅?br>概述;
面向?qū)ο笫鞘裁矗?/p>
是使用一系列對(duì)象相互協(xié)作軟件設(shè)計(jì),目的是在編程中促進(jìn)更好靈活性和可維護(hù)性,憑借對(duì)模塊化重視,面向?qū)ο蟠a開(kāi)發(fā)更簡(jiǎn)單,容易理解
面向?qū)ο蟮挠兄饕卣魇?.封裝;2.繼承;3.多態(tài)
封裝;
封裝主要用于敘述對(duì)象中所包含(封裝)的內(nèi)容,由兩部分組成
相關(guān)的數(shù)據(jù)(儲(chǔ)存屬性)
這些數(shù)據(jù)所能做的事情
繼承;
是指類(lèi)和類(lèi)之間的關(guān)系,如兩個(gè)類(lèi)都有相同的屬性和方法,那么其中一個(gè)類(lèi)并可以繼承另一個(gè)類(lèi),這樣不需要再次定義同樣的屬性和方法
創(chuàng)建一個(gè)或多個(gè)類(lèi)專(zhuān)門(mén)類(lèi)方式稱(chēng)為繼承,有兩個(gè)類(lèi)其中一個(gè)叫子類(lèi),另一個(gè)是叫做父類(lèi)
多態(tài);
不同的對(duì)象可以定義有相同名稱(chēng)方法,方法是作用所在對(duì)象中,不同對(duì)象相同方法調(diào)用各自行為能力則為多態(tài)
如A對(duì)象有sayMe()方法,B對(duì)象繼承A對(duì)象,而B(niǎo)對(duì)象也有具有sayMe()方法,sayMe()方法時(shí),并不知道該方法A對(duì)象還是B對(duì)象,且不影響代碼正常工作
2.構(gòu)造函數(shù);
構(gòu)造函數(shù);
構(gòu)造函數(shù)稱(chēng)為構(gòu)造器和對(duì)象模版是對(duì)象的一餓方法,構(gòu)造器被調(diào)用,在
JS(JavaScript)中函數(shù)可以作為構(gòu)造器使用,,并不需要定義個(gè)構(gòu)造器方法
構(gòu)造函數(shù)的屬性;
就是對(duì)象的變量,一個(gè)對(duì)象包含多個(gè)屬性,定義構(gòu)造函數(shù)屬性是使用this關(guān)鍵字
構(gòu)造函數(shù)的方法;
該方法,很想構(gòu)造函數(shù)屬性,不同是方法是個(gè)函數(shù)(或像函數(shù)一樣定義)定義構(gòu)造函數(shù)屬性是使用this關(guān)鍵字
this關(guān)鍵字
有套完全不同于其它語(yǔ)言對(duì)this處理機(jī)制,this關(guān)鍵字本身沒(méi)有任何意義
/* 用于創(chuàng)建對(duì)象(屬性和方法) function 構(gòu)造函數(shù)名稱(chēng)(){ this.屬性名 = 屬性值; this.方法名 = function(){ 方法體 } } this關(guān)鍵字-指代利用當(dāng)前構(gòu)造函數(shù)創(chuàng)建的對(duì)象 */ function Hero(name){ this.name = name; this.sayMe = function(){ console.log("我是" + name); } } // 利用構(gòu)造函數(shù)創(chuàng)建對(duì)象 var hero = new Hero("犬夜叉"); console.log(hero); var obj = { name : "犬夜叉", sayMe : function(){ console.log("我是犬夜叉"); } }
二.Object類(lèi)型;
1.操作對(duì)象的屬性;
設(shè)置屬性描述符value;
是該屬性所對(duì)應(yīng)值,可以是如何有效的JS(JavaScript)值(數(shù)值,對(duì)象,函數(shù))為默認(rèn)值undefined
var obj = { // 定義對(duì)象的同時(shí)定義了該屬性以及值(可修改、可刪除以及可枚舉的) name : "犬夜叉" } Object.defineProperty(obj, "name", { value : "桔梗" }); console.log(obj.name);// 桔梗 /* 同樣都是為對(duì)象新增屬性 1.如果直接使用 "對(duì)象名.屬性名 = 值" -> 可修改、可刪除以及可枚舉的 2.如果使用Object.defineProperty()方法新增屬性 * 該新屬性是不可修改、不可刪除以及不可枚舉的 */ Object.defineProperty(obj, "age", { value : 16 }); console.log(obj.age);// 16 var result1 = Object.getOwnPropertyDescriptor(obj, "age"); console.log(result1); // 一旦屬性的值是不可修改的 - 如果執(zhí)行修改操作時(shí) -> 沒(méi)有語(yǔ)法報(bào)錯(cuò),但是無(wú)效 obj.age = 80; console.log(obj.age);// 16 obj.job = "妖狐"; var result2 = Object.getOwnPropertyDescriptor(obj, "job"); console.log(result2);
設(shè)置屬性描述符writable;
當(dāng)該屬性為true時(shí),value才能被賦值運(yùn)算符所改變,默認(rèn)為false
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);// 16 // 修改age屬性值 obj.age = 80; console.log(obj.age);// 80 // 刪除age屬性值 delete obj.age; console.log(obj.age);// undefined
設(shè)置屬性描述符configurable;
該屬性為true時(shí),該屬性描述符才能改變,同時(shí)會(huì)從相同的對(duì)象中被刪除,默認(rèn)為false
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; console.log(obj.name);// 桔梗
設(shè)置屬性描述符enumerable;
該屬性為true時(shí),屬性才能出現(xiàn)在對(duì)象枚舉屬性中,默認(rèn)為false
var obj = { // 定義對(duì)象的同時(shí)定義了該屬性以及值(可修改、可刪除以及可枚舉的) name : "犬夜叉" } Object.defineProperty(obj, "name", { value : "桔梗", enumerable : false }); console.log(obj.name);// 桔梗 /* 屬性描述符enumerable - 控制當(dāng)前屬性是否可被枚舉(遍歷) * 僅能循環(huán)遍歷對(duì)象中可被枚舉的屬性 * for...in語(yǔ)句 * 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è)置方法
var obj = { sayMe : function(){ console.log("this is function"); } } var result = Object.getOwnPropertyDescriptor(obj, "sayMe"); console.log(result); Object.defineProperty(obj, "sayMe", { value : function(){ console.log("this is new function"); }, writable : false }); obj.sayMe(); obj.sayMe = function(){ console.log("這是犬夜叉"); } obj.sayMe();
屬性描述符存取器
var obj = { name : "犬夜叉" } var value;// 全局變量 Object.defineProperty(obj,"name",{// 當(dāng)獲取或訪問(wèn)當(dāng)前屬性時(shí),會(huì)調(diào)用get方法 get : function () { // 獲取指定的屬性值 console.log("Inuyasha"); /* get方法在被調(diào)用時(shí),不能傳遞任何參數(shù) get方法在被調(diào)用時(shí),允許傳遞this關(guān)鍵字 this - 表示當(dāng)前的目標(biāo)對(duì)象(不能調(diào)用對(duì)象的當(dāng)前目標(biāo)屬性) */ return value;// 由于變量為初始化,調(diào)用時(shí)可能結(jié)果為 undefined }, set : function (newValue) { console.log("Inuyasha: " + value); value = newValue; /* set方法在被調(diào)用時(shí),允許傳遞this關(guān)鍵字 this - 表示當(dāng)前的目標(biāo)對(duì)象(不能調(diào)用對(duì)象的當(dāng)前目標(biāo)屬性) */ } }) console.log(obj.name);// undefined obj.name = "桔梗"; console.log(obj.name);//桔梗
2.防篡改對(duì)象;
禁止擴(kuò)展
Object.preventExtensions()表示對(duì)象不可擴(kuò)展,不能新增屬性和方法
Object.isExtensible()表示判斷是否可擴(kuò)展
var obj = {}; // 將對(duì)象設(shè)置禁止擴(kuò)展 Object.preventExtensions(obj); // 新增屬性或方法無(wú)效 -> 語(yǔ)法沒(méi)有報(bào)錯(cuò) obj.name = "犬夜叉"; console.log(obj); /* Object.defineProperty()方法新增屬性 * 結(jié)果 - 報(bào)錯(cuò) * 信息 - TypeError: Cannot define property:name, object is not extensible. */ Object.defineProperty(obj, "name", { value : "桔梗" }); console.log(obj); /* Object.isExtensible(obj)方法 * 作用 - 用于判斷指定目標(biāo)對(duì)象是否可擴(kuò)展 * 返回值 * true - 表示指定目標(biāo)對(duì)象是可擴(kuò)展的 * false - 表示指定目標(biāo)哦對(duì)象是不可擴(kuò)展的 */ var result = Object.isExtensible(obj); console.log(result);
密封對(duì)象
Object.seal()表示封閉個(gè)對(duì)象,阻止增加新屬性,現(xiàn)有屬性不可設(shè)置,
Object.isSealed()判斷個(gè)對(duì)象是否密封
var obj = { name : "犬夜叉" // 表示可修改 }; console.log(Object.getOwnPropertyDescriptor(obj, "name")); /* 將該對(duì)象進(jìn)行密封 1.不能為該對(duì)象新增屬性或方法 2.不能修改該對(duì)象的屬性或方法的描述符 * configurable * enumerable */ Object.seal(obj); console.log(Object.getOwnPropertyDescriptor(obj, "name")); /*Object.defineProperty(obj, "age", { value : 16 });*/ Object.defineProperty(obj, "name", { value : "桔梗", writable : false, // 表示不可修改 configurable : true, enumerable : false }); console.log(Object.getOwnPropertyDescriptor(obj, "name")) console.log(obj); obj.name = "戈薇"; console.log(obj);
凍結(jié)對(duì)象
Object.freeze()凍結(jié)個(gè)對(duì)象,不能增加新屬性給該對(duì)象,也不能修改此屬性值,已有屬性不能刪除,也不能修改此對(duì)象的屬性,該方法返回被凍結(jié)對(duì)象
Object.isFrozen()判斷個(gè)對(duì)象是否被凍結(jié)
var obj = { name : "犬夜叉" } // 凍結(jié)對(duì)象 Object.freeze(obj); /*obj.age = 16; console.log(obj); obj.name = "桔梗"; console.log(obj); delete obj.name; console.log(obj);*/ Object.defineProperty(obj, "age", { value : 16 }); console.log(obj);
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/108200.html
摘要:很多情況下,通常一個(gè)人類(lèi),即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類(lèi)是相似對(duì)象的描述,稱(chēng)為類(lèi)的定義,是該類(lèi)對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類(lèi)的實(shí)體化形成的對(duì)象。一類(lèi)的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類(lèi)的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類(lèi),即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類(lèi)是相似對(duì)象的描述,稱(chēng)為類(lèi)的定義,是該類(lèi)對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類(lèi)的實(shí)體化形成的對(duì)象。一類(lèi)的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類(lèi)的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類(lèi),即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類(lèi)是相似對(duì)象的描述,稱(chēng)為類(lèi)的定義,是該類(lèi)對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類(lèi)的實(shí)體化形成的對(duì)象。一類(lèi)的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類(lèi)的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:是完全的面向?qū)ο笳Z(yǔ)言,它們通過(guò)類(lèi)的形式組織函數(shù)和變量,使之不能脫離對(duì)象存在。而在基于原型的面向?qū)ο蠓绞街?,?duì)象則是依靠構(gòu)造器利用原型構(gòu)造出來(lái)的。 JavaScript 函數(shù)式腳本語(yǔ)言特性以及其看似隨意的編寫(xiě)風(fēng)格,導(dǎo)致長(zhǎng)期以來(lái)人們對(duì)這一門(mén)語(yǔ)言的誤解,即認(rèn)為 JavaScript 不是一門(mén)面向?qū)ο蟮恼Z(yǔ)言,或者只是部分具備一些面向?qū)ο蟮奶卣?。本文將回歸面向?qū)ο蟊疽猓瑥膶?duì)語(yǔ)言感悟的角度闡述為什...
摘要:用代碼可以這樣描述安全到達(dá)國(guó)外面向過(guò)程既然說(shuō)了面向?qū)ο?,那么與之對(duì)應(yīng)的就是面向過(guò)程。小結(jié)在這篇文章中,介紹了什么是面向?qū)ο蠛兔嫦蜻^(guò)程,以及中對(duì)象的含義。 這是 javascript 面向?qū)ο蟀鎵K的第一篇文章,主要講解對(duì)面向?qū)ο笏枷氲囊粋€(gè)理解。先說(shuō)說(shuō)什么是對(duì)象,其實(shí)這個(gè)還真的不好說(shuō)。我們可以把自己當(dāng)成一個(gè)對(duì)象,或者過(guò)年的時(shí)候相親,找對(duì)象,那么你未來(lái)的老婆也是一個(gè)對(duì)象。我們就要一些屬性,比...
摘要:之前,本質(zhì)上不能算是一門(mén)面向?qū)ο蟮木幊陶Z(yǔ)言,因?yàn)樗鼘?duì)于封裝繼承多態(tài)這些面向?qū)ο笳Z(yǔ)言的特點(diǎn)并沒(méi)有在語(yǔ)言層面上提供原生的支持。所以在中出現(xiàn)了等關(guān)鍵字,解決了面向?qū)ο笾谐霈F(xiàn)了問(wèn)題。 ES6之前,javascript本質(zhì)上不能算是一門(mén)面向?qū)ο蟮木幊陶Z(yǔ)言,因?yàn)樗鼘?duì)于封裝、繼承、多態(tài)這些面向?qū)ο笳Z(yǔ)言的特點(diǎn)并沒(méi)有在語(yǔ)言層面上提供原生的支持。但是,它引入了原型(prototype)的概念,可以讓我們以...
閱讀 3559·2023-04-26 00:39
閱讀 4786·2021-09-22 10:02
閱讀 2611·2021-08-09 13:46
閱讀 1175·2019-08-29 18:40
閱讀 1496·2019-08-29 18:33
閱讀 826·2019-08-29 17:14
閱讀 1569·2019-08-29 12:40
閱讀 3089·2019-08-28 18:07