js 中對象--對象結構(原型鏈基礎解析)

来源:http://www.cnblogs.com/Ziksang/archive/2016/02/12/5186907.html
-Advertisement-
Play Games

對於本篇對於如何自定義對象、和對象相關的屬性操作不瞭解的話,可以查我對這兩篇博客。瞭解後可以更容易理解本篇文章 用構造函數創建了一個對象 obj對象的本身創建了兩個屬性 x=1 ,y=2 對象本的的兩個屬性都有屬性特征 writable是否可寫的,enumerable是否可枚舉的 configura


對於本篇對於如何自定義對象、和對象相關的屬性操作不瞭解的話,可以查我對這兩篇博客。瞭解後可以更容易理解本篇文章

       

 用構造函數創建了一個對象

 obj對象的本身創建了兩個屬性  x=1   ,y=2    

 對象本的的兩個屬性都有屬性特征  writable是否可寫的,enumerable是否可枚舉的 configurable是否可重置的,getter  ,setter

 obj對象本身也有三大特性    proto 原型    class 類     extensible可拓展

 foo.prototype是對象上的原型 , foo.prototype也是個對象。

 z=3是foo.prototype是對象上原型的屬性。

 再往上object.prototype是一個頂級屬性,是所有對象的原型。

 再上往上就是null 空了。  此時就形成了一個原型鏈。

 我再用代碼來一一解析,用演示代碼再向大家詳細解釋:

 

 1 <script>
 2       function Foo(){    //聲名一個函數FOO
 3 
 4       }
 5       alert(typeof Foo.prototype)    //Foo.prototype 是一個對象。也可以是obj對象上的原型
 6       Foo.prototype.z =3    //設置了原型屬性z為3
 7       var obj = new Foo()    //用構建函數來創建了obj對象
 8       obj.x = 1;            //x=1是obj對象上本身的屬性
 9       obj.y = 2;           //y=2是obj對象上本身的屬性
10       alert(obj.x)         //=>1 對過查詢對象,我們是否得到這個屬性值
11       alert(obj.y)         //=>1 對過查詢對象,我們是否得到這個屬性值
12       alert(obj.z)        //=》3 z不是obj本身的屬性,是他原型上的屬性,如果本身沒有,可以向他的原型鏈上的原型來查找,得到z屬性
13       alert(obj.toString())//=toString是頂級object對象上的屬性,先是查找原型上有沒有這個屬性,如果沒有再往原型鏈上頂級的object對象上找
14 </script>

 

再來瞭解一下得到對象上屬性的優先順序。

如果在對象本身上有這個屬性,則得到的是對象上本身的屬性。

如果對象本身上沿岸有這個屬性,則向他的原型上查找。

如果再沒有再向頂級屬性上查找。

如果原型上和對象本身上都有這個屬性,則還是先用對象本身的屬性

為了讓大家更好的瞭解,演示代碼如下:

 1 <script>
 2       function Foo(){    //聲名一個函數FOO
 3 
 4       }
 5       Foo.prototype.z =3    //設置了原型屬性z為3
 6       var obj = new Foo()    //用構建函數來創建了obj對象
 7       obj.z = 5     //定義對象的屬性Z = 5
 8       alert(obj.z)   //=>5  如果對象上本身定義了屬性z ,則先用對象本身的屬性
 9       delete obj.z;   //刪除對象上本身的屬性
10       alert(obj.z);   //=>3再次獲取對象的z,結果發現對象本身z的屬性被刪除了,會自動往對象的原型上查找,得到z=3
11       delete Foo.prototype.z;  //刪除對象原型上的z屬性
12       alert(obj.z)   //=> undefined 因為對象本身的z屬性被刪除,原型上的z屬性也被刪除,再繼續往頂級對象Object上查找,沒有此屬性,返回undefined
13 </script>

通過 var obj = Object.create({x:1}) 來創建對象來解析對象、對象上的原型

其實obj.create圓括弧裡面定義對象和屬性就是obj對象的原型和原型屬性,

演示代碼如下:

1 <script>
2     var obj = Object.create({z:4})  //Object.create({z:4})是一個對象上的一個原型,z是原型上的屬性
3       obj.x = 1      //x是對象本身的屬性
4       obj.z = 3         //z是對象本身的屬性
5       alert(obj.x)     //=>1  輸出的是對象本身的x
6       alert(obj.z)     //=>3  輸出的是對象本身的z
7       delete obj.z;    //當我們刪除對象本的z
8       alert(obj.z)    //就是會向原型上面查找原型上有沒有這個屬性,如果有,z指的是原型上的屬性    
9 </script>

通過In來解釋某個對象上是否有這個屬性:

演示代碼如下:

 1 <script>
 2     //用  屬性 In  對象來檢測 是否是對象上的屬性,返回true否是,返回false 則不是
 3      function Foo(){
 4 
 5      }
 6      Foo.prototype.z = 5
 7      var obj = new Foo()
 8      obj.x = 1 ;
 9      obj.y = 2;
10      alert("x" in obj)   //=>true x是對象上本身定義的屬性
11      alert("y" in obj)   //=>true y也是對象上本身定義的屬性
12      alert("z" in obj)   //=>true z是從對象原型上繼承來的屬性
13      alert("toString" in obj) //=>true toString是從頂級對象Object上繼承來的屬性
14      alert("no" in obj)   //=>false  對象本上沒有,查找整個原型鏈都沒有這個屬性直到null 則反回false,
15 </script>

通過hasOwnProperty查找是否是對象本身的屬性,而不是繼承來的屬性

 1 <script>
 2     //用對象.hasOwnProperty("屬性") 來檢測是否是對象本身的屬性,而不是繼承來的
 3      function Foo(){
 4 
 5      }
 6      Foo.prototype.z = 5
 7      var obj = new Foo()
 8      obj.x = 1 ;
 9      obj.y = 2;
10      alert(obj.hasOwnProperty("x")) //=>true   x是對象本身定義的屬性,所以返回true
11      alert(obj.hasOwnProperty("z")) //=>false   z是對象原型上繼承的屬性,所以返回false
12      alert(obj.hasOwnProperty("toString")) //=>false   toString是頂級對象上繼承來的屬性,所以返回false
13 </script>

我們最後來看看用var obj = Objcet.create()來創建的對象如何來檢測他的屬性。

如果想沒有任何繼續屬性的話可以寫  var obj = Object.create(null) 則不繼承任何屬性

演示代碼:

 1 <script>
 2      var obj = Object.create({x:1})
 3       obj.y = 2
 4      alert("y" in obj)  //=>true
 5      alert("x" in obj)  //=>true
 6      alert("toString" in obj)  //=>true
 7      alert(obj.hasOwnProperty("x")) //=>false
 8      alert(obj.hasOwnProperty("y"))  //=>true
 9     var obj1 = Object.create(null)
10     alert("toString" in obj1)    //=>false 創建了一個不繼承任何屬性的對象obj1,直到頂級對象Object對象都不繼承
11 </script>

 


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

-Advertisement-
Play Games
更多相關文章
  • 官網地址 本文內容 簡介 Futures 阻塞 異常 Promises 工具 最近看了《七周七語言:理解多種編程泛型》,介紹了七種語言(四種編程泛型)的主要特性:基本語法,集合,並行/併發,其中就有 Scala。你不能指望這種書全面介紹,因為其中任何一門語言都夠寫一本書了~ 我比較關註並行/併發,但
  • 1 /* 2 類是屬於用戶自定義的數據類型, 3 並且該類型的數據具有一定的行為能力, 4 也就是類中說描述的方法。 5 通常來說, 6 一個類的定義包含兩部分的內容, 7 一是該類的屬性, 8 另一部分是它所擁有的方法。 9 以 "人類" 這個類來說, 10 每個人都有自己的姓名、年齡、出生日期、
  • 本文實例講述了PHP實現上傳文件並存進資料庫的方法。分享給大家供大家參考。具體如下: show_add.php文件如下: <?php if(!isset($_REQUEST[''id'']) or $_REQUEST[''id'']=="") die("error: id none"); $id =
  • PageControl位於Win32選項卡中,可以在控制項上右鍵點擊“New Page”,來實現靜態的頁面添加。 先說說幾個重要的屬性: ActivePage:當前活動的頁面(在設計模式中切換頁面會更改ActivePage屬性) MultiLine:選項卡以多行形式顯示。 Style:頁面樣式。 ts
  • 同事演示了一個.NET的的PNG異形視窗.挺漂亮.於是也想用Delphi顯擺一個. 關於Delphi用PNG做異形視窗的資料有不少.都是用GDIPlus或者TPNGImage組件載入PNG圖像做的. 好在Delphi包裝了微軟的IWICImagingFactory介面,這樣處理PNG的工作就交給操作
  • 一、模塊 1.模塊簡介 模塊是一個包含所有你定義的函數和變數的文件,其尾碼名是.py。模塊可以被別的程式引入,以使用該模塊中的函數等功能。這也是使用python標準庫的方法。 類似於函數式編程和麵向過程編程,函數式編程則完成一個功能,其他代碼用來調用即可,提供了代碼的重用性和代碼間的耦合。而對於一個
  • Java繪製笑臉小應用程式
  • 對於這個抽象工廠的相應的代碼實現 /** * 功能:抽象工廠模式的作用 適用性 1.一個系統要獨立於它的產品的創建、組合和表示時。 2.一個系統要由多個產品系列中的一個來配置時。 3.當你要強調一系列相關的產品對象的設計以便進行聯合使用時。 4.當你提供一個產品類庫,而只想顯示它們的介面而不是實現時
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...