我不知道自己這麼定義是不是準確,因為本身我對反射不怎麼瞭解,只是知道通過反射可以擷取一個類的方法和屬性,慚愧,說這句話怎麼也不像一個程式員!我這麼定義這一個標題,可能對於我的需求而言,有點過大,但是還是這麼寫下來,只是給自己一個研究的問題,饅頭總是要一口一口的吃!
需求:判斷一個對象為Array
就是這麼一個簡單的需求,說不上什麼反射,呵呵。
在網上查了一下資料,解決辦法如下:
可以判斷它的構造器是什麼,進而判斷它是Array還是Object!<script>
var o=new Array('10','25','50');
if (o.constructor == Array)
{
alert("Array");
}
var str="xxxxxxxxxxxxxx";
if (str.constructor == String)
{
alert("String");
}
</script>
在js協助中,Contructor解釋如下:
constructor 屬性
描述
表示建立對象的函數。
文法
object.constructor
必需的 object 參數是對象或函數的名稱。
說明
constructor 屬性是所有具有 prototype 的對象的成員。它們包括除 Global 和 Math 對象以外的所有 JScript 固有對象。constructor 屬性儲存了對構造特定對象執行個體的函數的引用。 例如:
x = new String("Hi");
if (x.constructor == String)
// 進行處理(條件為真)
或
function MyFunc
{
// 函數體。
}
y = new MyFunc;
if (y.constructor == MyFunc)
// 進行處理(條件為真)
這裡再引用flyingis的JavaScript 對象的反射及應用中的幾句話:
檢測一個JavaScript對象是否支援某種特定的屬性或方法:
if (typeof(obj.property) != "undefined") {}
這樣聲明比直接使用"if (obj.property)"來描述要更準確,因為當obj.property的值為false、0、null的時候,雖然該屬性存在,但返回的結果卻恰恰相反。
如果要求檢測更詳細一些,查看該屬性的具體類型,可以用instanceof操作符:
if (obj instanceof PredefinedObj) {}
但是,當對obj對象進行條件檢測的時候,如果多種條件的物件類型存在繼承關係,則需要注意代碼的書寫順序,例如:
function() ExamineType(obj)
{
if (obj instanceof Object)
{
alert("An Object");
}
else if (obj instanceof Array)
{
alert("An Array");
}
}
上述代碼執行的結果會認為原為Array類型的obj是一個Object,因為Array本身就是從Object繼承而來,顯然,將對Array的檢測放在前面會得到更精確的結果。因此,使用instanceof來判斷物件類型,需要注意當兩個對象存在繼承關係的時候,應該關注檢測順序的問題,進一步我們可以想到,JSON建立的對象不是Object就是Array,使用instanceof來檢測JSON對象意義不大。
這裡再推薦一篇文章,希望大家能有點收穫《AJAX的JavaScript的反射機制》《利用反射機制和prototype 實現繼承》