轉自 : http://www.bjcan.com/hengxing/readlou.asp?id=1162

八、JavaScript面向對象的支持
~~~~~~~~~~~~~~~~~~
(續)


2. JavaScript面向對象的支持
--------
(續)

?5). 使用instanceof關鍵字的運算
?------
?在JavaScript中提供了instanceof關鍵字來檢測實例的類型。這在前面討
論它的“五重身份”時已經講過。但instanceof的問題是,它總是列舉整個
原型鏈以檢測類型(關于原型繼承的原理在“構造與析構”小節講述),如:
//---------------------------------------------------------
// instanceof使用中的問題
//---------------------------------------------------------
function MyObject() {
? // ...
}

function MyObject2() {
? // ...
}
MyObject2.prototype = new MyObject();

obj1 = new MyObject();
obj2 = new MyObject2();

document.writeln(obj1 instanceof MyObject, '<BR>');
document.writeln(obj2 instanceof MyObject, '<BR>');

我們看到,obj1與obj2都是MyObject的實例,但他們是不同的構造函數產生
的。——注意,這在面向對象理論中正確的:因為obj2是MyObject的子類實
例,因此它具有與obj1相同的特性。在應用中這是obj2的多態性的體現之一。

但是,即便如此,我們也必須面臨這樣的問題:如何知道obj2與obj1是否是
相同類型的實例呢?——也就是說,連構造器都相同?

instanceof關鍵字不提供這樣的機制。一個提供實現這種檢測的能力的,是
Object.constructor屬性。——但請先記住,它的使用遠比你想象的要難。

好的,問題先到這里。constructor屬性已經涉及到“構造與析構”的問題,
這個我們后面再講。“原型繼承”、“構造與析構”是JavaScript的OOP中
的主要問題、核心問題,以及“致命問題”。


?6). null與undefined
?------
?在JavaScript中,null與undefined曾一度使我迷惑。下面的文字,有利于
你更清晰的認知它(或者讓你更迷惑):
?? - null是關鍵字;undefined是Global對象的一個屬性。
?? - null是對象(空對象, 沒有任何屬性和方法);undefined是undefined類
???? 型的值。試試下面的代碼:
?????? document.writeln(typeof null);
?????? document.writeln(typeof undefined);
?? - 對象模型中,所有的對象都是Object或其子類的實例,但null對象例外:
?????? document.writeln(null instanceof Object);
?? - null“等值(==)”于undefined,但不“全等值(===)”于undefined:
?????? document.writeln(null == undefined);
?????? document.writeln(null == undefined);
?? - 運算時null與undefined都可以被類型轉換為false,但不等值于false:
?????? document.writeln(!null, !undefined);
?????? document.writeln(null==false);
?????? document.writeln(undefined==false);