深入JavaScript(2) - 對象, 一切皆對象?


書接上文..

JavaScript 設計 prototype 的目的就是為了繼承, 所以不要把 prototype 用作其它目的.

為什么 JavaScript 使用 prototype 來實現繼承呢? 因為 JavaScript 誕生的最初目的是為了實現前端表單驗證, 當時的 Internet 太慢了, 傳到后台驗證等不起. 所以 JavaScript 的作者認為沒有必要把繼承設計的像 Java 里那樣復雜, 就選了用 prototype.

  1. Undefined類型: 只有一個值 undefined. 一個變量沒有被賦值的時候就是該值.
  2. Null類型: 只有一個值 null. 對象的值故意留空的時候為該值.

這里是一個有趣的地方:

undefined == null;    // true

undefined === null;    // false

 我記得這種結果的原因是, null是從undefined派生出來的.

-----------------

JavaScript規范里寫着有三種對象: 原生對象, 內置對象; 宿主對象

原生對象包含內置對象, 在程序執行之間就存在的對象.

宿主對象由宿主環境提供, 比如: 瀏覽器, Adobe軟件等

 

在內置對象中, 有一大部分有點特殊功能! 那就是函數對象!!

那么語言內部是怎么標識的呢? 有一個內部屬性[[Class]]

如果是一般的對象, 內部[[Class]]屬性值為 "Object";

如果是函數對象, 內部的[[Class]]屬性值為 "Function";

函數對象有的是普通函數, 比如: parseInt();

而有的又有一些特殊功能, 就是可以當構造器用, 叫做構造函數, 它們會在內部實現 [[Construct]] 方法,  比如 Array();

注意這里, parseInt() and Array() 都是函數對象, 都是對象!!

---------

所有函數對象會隱式的引用 Function.prototype (為什么? 烏龜的屁股 -- 規定!)

所有內置的原型對象, 會隱式的引用 Object.prototype. (為什么? 烏龜的屁股 -- 規定!)

看到這兒, 細心的人可能會有個疑問, Object.prototype也是內置的原型對象, 它也會自己隱式的引用自己? 怎么這么奇怪?

答: 是有點混亂, 於是有了 補充規定: 除了 Object.prototype , 其它內置原型對象會隱式的引用 Object.prototype

怎么通過代碼來檢測上面給出的定理一樣的東西呢.. 還記得在上篇中 prototype隱式的引用可以用 __ proto__ 來訪問.

// 下面是一些 完全等於 關系, 大家可以把 ".__proto__ === " 想像成一條繩索, 可以
// 把左右兩個對象串聯起來. 假如找一個屬性, 在左邊沒找到的話, 就會沿着繩索爬過右
// 邊繼續邊, 要是沒找到就繼續往右爬 - -, 直接到最后爬到一個null - 空對象上.

// 內置函數對象隱式引用 Function的原型對象
parseInt.__proto__ === Function.prototype
Array.__proto__ === Function.prototype
Object.__proto__ === Function.prototype
// 注意 Function 自己也不例外
Function.__proto__ === Function.prototype

// 內置原型對象隱式引用 Object 的原型對象
Function.prototype.__proto__ === Object.prototype
Array.prototype.__proto__ === Object.prototype

// 再來一個等式, 原型鏈的終點
Object.prototype.__proto__ === null

/*
通過上面的等式, 我們可以建立起一些繩索(把 .__proto__ === 替換成繩子!):

parseInt() ~~~ Function.prototype ~~~ Object.prototype ~~~ null
Array() ~~~ Function.prototype ~~~ Object.prototype ~~~ null
Object() ~~~ Function.prototype ~~~ Object.prototype ~~~ null
Function() ~~~ Function.prototype ~~~ Object.prototype ~~~ null
*/

 這篇里講的都是內置的東西, 也是基礎! 理解好之后繼承就好理解了, 關系也清楚了.

如果還是迷糊, 為什么是上面那個樣子, 有一招, 記住它們是烏龜的屁股 -- 規定!

 之后會寫我們自己創建的對象是什么樣子, 繩子把誰綁在一起了呢?

待續...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM