原型與繼承學習筆記2

来源:http://www.cnblogs.com/wangxiaosan/archive/2016/05/27/5535606.html
-Advertisement-
Play Games

上節我們討論了對象的定義和對象的創建,知道了函數也是對象,知道了對象都是由函數創建的,知道了對象的原型和函數的原型屬性的關係。這節說一下關於對象屬性的操作,下節就可以切入正題了。 屬性刪除 delete操作符刪除一個屬性值後會返回true,第5行也返回true是因為person.age已經是個und ...


上節我們討論了對象的定義和對象的創建,知道了函數也是對象,知道了對象都是由函數創建的,知道了對象的原型和函數的原型屬性的關係。這節說一下關於對象屬性的操作,下節就可以切入正題了。

    屬性刪除

 1 var person = {age : 28, title : 'fe'};
 2 delete person.age; // true
 3 delete person['title']; // true
 4 person.age; // undefined
 5 delete person.age; // true
 6 
 7 delete Object.prototype; // false,
 8 
 9 var descriptor = Object.getOwnPropertyDescriptor(Object, 'prototype');
10 console.log(descriptor)     //Object {value: Object, writable: false, enumerable: false, configurable: false}

 

delete操作符刪除一個屬性值後會返回true,第5行也返回true是因為person.age已經是個undefined,所以仍然會返回一個true,第7行刪除Object的prototype屬性返回了一個false,我們可以通過第9行Object.getOwnPropertyDescriptor()方法查看一下Object.prototype的特性,configurable屬性值為false(不可配置),因此返回false。

    屬性檢測

1 var cat = new Object();
2 cat.legs=4;
3 'legs' in cat;      //true
4 'toString' in cat;      //false
5 cat.propertyIsEnumerable('legs'); // true
6 cat.propertyIsEnumerable('toString'); // false

 

 使用propertyIsEnumerable()可以判斷一個屬性是不是可枚舉的,如果想設置一個屬性的特性是不是可枚舉的怎麼辦呢,看下邊:

1 Object.defineProperty(cat, 'price', {enumerable : true, value : 1000});
2 cat.propertyIsEnumerable('price'); // true
3 cat.hasOwnProperty('price'); // true

 

使用Object.defineProperty()方法可以設置屬性的特性值,如上我們可以把可枚舉的特性設置為true或false。

    屬性枚舉

in關鍵字可以判斷屬性是否存在,for in語句則不能枚舉enumerable 值為false的屬性,如:

1 var o={a:'1',b:'2'}
2 Object.defineProperty(o,'c',{
3     Enumberable:false
4 });
5 console.log('c' in o)   //true
6 var key;
7 for(key in o){
8     console.log(key)    //a,b
9 }

    get/set方法

get/set方法是另一種進行屬性操作的方式,如:

 1 var man = {
 2     name : 'James',
 3     get age() {
 4         return new Date().getFullYear() - 1988;
 5     },
 6     set age(val) {
 7         console.log('Age can\'t be set to ' + val);
 8     }
 9 }
10 console.log(man.age); // 27
11 man.age = 100; // Age can't be set to 100
12 console.log(man.age); // 27

 

取一個屬性值age時會觸發get方法,給age賦值時觸發set方法,賦值成不成功取決於set方法內部是否會對屬性進行修改。

    屬性標簽

1 Object.getOwnPropertyDescriptor({pro : true}, 'pro');
2 // Object {value: true, writable: true, enumerable: true, configurable: true}
3 Object.getOwnPropertyDescriptor({pro : true}, 'a'); // undefined

 

 前邊提到過這個方法,可以返回一個屬性特性描述的對象,分別有4個屬性,value表示屬性值,writable表示屬性值是否可寫,enumberable表示屬性值是否可被枚舉,configurable表示屬性是否可被用其他方式進行操作(如delete操作符)。

 1 Object.defineProperties(person, {
 2     title : {value : 'fe', enumerable : true},
 3     corp : {value : 'BABA', enumerable : true},
 4     salary : {value : 50000, enumerable : true, writable : true},
 5     luck : {
 6         get : function() {
 7         return Math.random() > 0.5 ? 'good' : 'bad';
 8         }
 9     },
10     promote : {
11         set : function (level) {
12             this.salary *= 1 + level * 0.1;
13         }
14     }
15 });
16 
17 Object.getOwnPropertyDescriptor(person, 'salary');
18 // Object {value: 50000, writable: true, enumerable: true, configurable: false}
19 Object.getOwnPropertyDescriptor(person, 'corp');
20 // Object {value: "BABA", writable: false, enumerable: true, configurable: false}
21 person.salary; // 50000
22 person.promote = 2;
23 person.salary; // 60000

 

使用Object.defineProperties()方法可以定義多個屬性的值,而且get,set方法可以不針對同一個屬性進行操作,這個例子可以系統包含整個知識點。所有的屬性特性值不輸入均預設為false。

下圖提供了configurable和writable不同情況下的操作影響:

可以看出這兩個屬性值均為true時我們基本可以做任何操作,屬性都為false時我們都做不了,其他情況就不再贅述了。

    對象標簽

對象標簽有三個:__proto__,__class__,__extensible__,__proto__下節討論。

__class__屬性無法直接訪問,我們只能藉助於Object.toString方法來簡介訪問到,如下:

 1 var toString = Object.prototype.toString;
 2 function getType(o){return toString.call(o).slice(8,-1);};
 3 
 4 toString.call(null); // "[object Null]"
 5 getType(null); // "Null"
 6 getType(undefined); // "Undefined"
 7 getType(1); // "Number"
 8 getType(new Number(1)); // "Number"
 9 typeof new Number(1); // "object"
10 getType(true); // "Boolean"
11 getType(new Boolean(true)); // "Boolean"

 

__extensible__標簽表示對象是否可擴展,即該對象是否可以繼續添加屬性,看下邊代碼:

 1 var obj = {x : 1, y : 2};
 2 Object.isExtensible(obj); // true
 3 Object.preventExtensions(obj);
 4 Object.isExtensible(obj); // false
 5 obj.z = 1;
 6 obj.z; // undefined, add new property failed
 7 Object.getOwnPropertyDescriptor(obj, 'x');
 8 // Object {value: 1, writable: true, enumerable: true, configurable: true}
 9 
10 Object.seal(obj);
11 Object.getOwnPropertyDescriptor(obj, 'x');
12 // Object {value: 1, writable: true, enumerable: true, configurable: false}
13 Object.isSealed(obj); // true
14 
15 Object.freeze(obj);
16 Object.getOwnPropertyDescriptor(obj, 'x');
17 // Object {value: 1, writable: false, enumerable: true, configurable: false}
18 Object.isFrozen(obj); // true
19 
20 // [caution] not affects prototype chain!!!

 

第2行代碼使用Object.isExtensible()方法,我們可以檢測是否可以進行對象屬性擴展,然後Object.preventExtensions()方法,我們可以設置對象不能進行擴展,但該對象屬性標簽的原始值仍然保持不變,如第7行;

使用seal()方法會將該對象的所有屬性標簽的configurable值設置為false,而freeze()方法會將該對象的所有屬性標簽的configurable和writable值均設置為false。

 

下節開始討論__proto__原型鏈和繼承相關內容。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 緩存優點 通常所說的Web緩存指的是可以自動保存常見http請求副本的http設備。對於前端開發者來說,瀏覽器充當了重要角色。除此外常見的還有各種各樣的代理伺服器也可以做緩存。當Web請求到達緩存時,緩存從本地副本中提取這個副本內容而不需要經過伺服器。這帶來了以下優點: 緩存減少了冗餘的數據傳輸 緩 ...
  • 1、框架的概念 框架:將一個瀏覽器視窗劃分成若幹個小視窗 2、框架集合框架頁 框架集<frameset>:主要用來劃分視窗的。 框架頁<frame>:主要用來指定視窗預設顯示的網頁地址。 一個簡單實例:該frame將窗體分成了左右兩欄,左欄200像素,右欄全部 效果 frameset 屬性 1、co ...
  • 緊接:"理清JavaScript正則表達式--上篇"。 類String支持四種利用正則表達式的方法。分別是search、replace、match和split方法。下麵將一一講述。 --String.search(regexp)-- search相對於其他三個方法,是應用正則最簡單的方法啦,作用就是 ...
  • 測試例子可以點擊這裡進行訪問:判斷手指滑動方向DEMO ...
  • 要改前人用的flexslider功能,但苦於找不到詳細的文檔教程,折磨了好久……(所以我才說不愛亂用插件) 為了福利下之後也苦於這個問題的人,我整理總結了下我找到的一些東西。可能沒那麼完善正確,歡迎在留言補充 ☆基礎使用☆ 英文什麼的,我才不想看咧……照著1234就好 https://www.woo ...
  • https://daveceddia.com/access-control-allow-origin-cors-errors-in-angular/ Getting this error in your Angular app? No ‘Access-Control-Allow-Origin’ he ...
  • 由於系統預設alert彈出視窗不能自定義樣式,有可能不符合網站的風格,雖然網上應該有很多這樣的JS 但是還是自己寫的比較放心,順便練習一下對DOM的操作 支持IE6下的SELECT不能遮罩的問題,谷歌支持圓角,IE6下就比較醜了,四四方方的,不過可以自定義自己喜歡的樣式 聽取建議後,修改了posit ...
  • 按步驟安裝--選擇指定瀏覽器-安裝成功後顯示綠色圖標; 打開瀏覽器;將文件夾移入wampserver安裝路徑的www文件夾中;找到電腦IP 在手機端訪問 IP/文件夾/demo.html即可 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...