書接上文..
JavaScript 設計 prototype 的目的就是為了繼承, 所以不要把 prototype 用作其它目的.
為什么 JavaScript 使用 prototype 來實現繼承呢? 因為 JavaScript 誕生的最初目的是為了實現前端表單驗證, 當時的 Internet 太慢了, 傳到后台驗證等不起. 所以 JavaScript 的作者認為沒有必要把繼承設計的像 Java 里那樣復雜, 就選了用 prototype.
- Undefined類型: 只有一個值 undefined. 一個變量沒有被賦值的時候就是該值.
- 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 */
這篇里講的都是內置的東西, 也是基礎! 理解好之后繼承就好理解了, 關系也清楚了.
如果還是迷糊, 為什么是上面那個樣子, 有一招, 記住它們是烏龜的屁股 -- 規定!
之后會寫我們自己創建的對象是什么樣子, 繩子把誰綁在一起了呢?
待續...