1. 程式人生 > >Js面向物件隨筆(1)

Js面向物件隨筆(1)

1、物件的概念:在ECMAScript-262中,物件被定義為“無序屬性的集合,其屬性可以包含基本值,物件或者函式,那麼在JavaScript中,物件也無非就是由一些無序的Key-Value對組成,其中Value可以是基本值,物件或者函式”。

2、我們常用Object.prototype.toString.call()這個方法判斷物件的具體型別,當然還有instanceof方法(關於這個方法下面有具體說明)以及typeof(typeof 可以對JS基礎資料型別做出準確的判斷,但物件引用型別的資料基本返回都是object)方法可以判斷,但都不怎麼準確,這我們試試就知道了

2.1 object instanceof constructor實際用來測試一個物件在其原型鏈中是否存在一個建構函式的 

prototype 屬性。(這裡初學者可能會迷惑到底什麼是原型鏈,原型鏈是由於所有物件都有原型,而原型本身也是物件,所以原型也可能有原型,這樣就構成了所謂的原型鏈。原型鏈終止於鏈中原型為 null 的物件,而當你new Object()時,實際上建立了一個原型為 Object.prototype 的物件,而該原型自身則擁有一個值為 null 的原型)也就是instanceof 運算子用來檢測 constructor.prototype 是否存在於引數 object 的原型鏈上。用程式碼可能更容易理解

// 定義建構函式
function C(){} 
function D(){} 

var o = new C();

// true,因為 Object.getPrototypeOf(o) === C.prototype
o instanceof C; 

// false,因為 D.prototype不在o的原型鏈上
o instanceof D; 

具體的,A instanceof  B是用來判斷 A 是否為 B 的例項對,表示式為:A instanceof B,如果A是B的例項,則返回true,否則返回false。 在這裡需要特別注意的是:instanceof檢測的是原型,我們用一段虛擬碼來模擬其內部執行過程:

instanceof (A,B) = {
    var L = A.__proto__;
    var R = B.prototype;
    if(L = = = R) {
        //A的內部屬性__proto__指向B的原型物件
        return true;
    }
    return false;
}
     當 A 的 __proto__ 指向 B 的 prototype 時,就認為A就是B的例項,再看幾個例子:
[] instanceof Array; //true
{} instanceof Object;//true
new Date() instanceof Date;//true

function Person(){};
new Person() instanceof Person;//true

[] instanceof Object; //true
new Date() instanceof Object;//true
new Person instanceof Object;//true
雖然 instanceof 能夠判斷出 [] 是Array的例項,但它認為 [] 也是Object的例項,為什麼呢? 我們來分析一下[]、Array、Object 三者之間的關係: 從instanceof 能夠判斷出 [].__proto__ 指向 Array.prototype, 而 Array.prototype.__proto__ 又指向了Object.prototype,Object.prototype.__proto__ 指向了null,標誌著原型鏈的結束。從原型鏈可以看出,[] 的 __proto__  直接指向Array.prototype, 間接指向Object.prototype, 所以按照 instanceof 的判斷規則,[] 就是Object的例項。當然,類似的new Date()、new Person() 也會形成這樣一條原型鏈,因此,instanceof 只能用來判斷兩個物件是否屬於原型鏈的關係, 而不能獲取物件的具體型別。通常來講使用instanceof 就是判斷一個例項是否屬於某種型別,更重的一點是 instanceof 可以在繼承關係中用來判斷一個例項是否屬於它的父型別。例如:
// 判斷 foo 是否是 Foo 類的例項 , 並且是否是其父型別的例項function Aoo(){}
function Foo(){} 
Foo.prototype = new Aoo();//JavaScript 原型繼承 
var foo = new Foo(); 
console.log(foo instanceof Foo)//true 
console.log(foo instanceof Aoo)//true