面向js的高級用戶,相信都會考慮到這些問題。
Object和Function有着異曲同工之妙,它們都可以有屬性和方法。不過卻有着極大的差別,
Object和function的一些比較
區 別 |
Object |
Function |
定義後 |
不能再使用new創建對象實例,可以賦值給其他變量,多個變量同時引用一個對象,或者克隆對象 |
可以使用new創建多個對象實例,使用時互不影響,但是使用內存也會更多 |
多態性 |
具備 |
具備 |
繼承 |
無法繼承,除非用複製的方式來實現 |
可以實現 |
toString和valueOf |
如果你不實現它的代碼,別人無法通過toString、valueOf查看到你的代碼 |
默認情況下,toString、valueOf是可以看到function的代碼的 |
prototype原型問題 |
給Object原型增加方法或屬性,new function出來的對象也同樣有這樣的方法——因此這是擴展通用對象功能的好地方 |
給Function原型增加方法或屬性,Object實例對象不會有這些方法和屬性 |
引用傳遞 |
支持 |
支持 |
數組下標運算符號的支持 |
通過設計可以支持 |
通過設計可以支持 |
prototype原型上擴展的屬性和方法 |
Mozilla Firefox中等於給body【包含】內容的所有HTML DOM對象擴展屬性和方法 |
Function原型上擴展,則不會 |
String、Number、Boolean對象不支持引用傳遞。
其他區別則是本章主要講解的內容,這裏就先不講。
其實,無論是Object也好,function也好,我們的目的都是一樣的,就是定義和創建一個可用對象實例,如果不是必需的,筆者特別推薦採用Object的形式,因爲定義和實例化一次就完成了。
許多讀者在想,本章的內容講的是不斷地在Object對象上進行擴展,以便在各種對象的應用時,隨時都能拿來就用,那麼內存消耗上會不會無形中增加許多,從而導致性能下降呢?其實你大可不必擔心,關於這個問題,筆者做了測試,創建100 000個對象,內存只是比一般的方式多了176K左右,平均下來是每個對象創建時多了1.8字節,犧牲這點內存是值得的,再說,你的設計中如果真要創建10萬以上對象卻又不delete,那你可真的要好好設計一下。這一測試下來,就很明白了,擴展Object,在各對象裏存在的只是對這個原始的Object的一個引用罷了。測試方式如下所示。
<html>
<head><meta. http-equiv=content-type content="text/html; charset=utf-8">
<title>測試”“對Object擴展後內存的使用情況”</title>
</head>
<body>
<!--
第一次觀察內參情況後在把這裏的註釋打開
<script. type="text/javascript" language="JavaScript" src="/jcore/resource/javascript/Jcore.js"></script>
-->
<script. type="text/javascript" language="JavaScript">
<!--
var arrTmp = [];for(var i = 0; i < 100000; i++) arrTmp.push(new Date);
-->
</script>
</body>
</html>
typeof和constructor總結 區別
下面都對變量test的值進行說明。有一點可以先說明的是,typeof的值始終只有這樣幾個:“number”、“string”、“Boolean”、“object”、“function”和“undefined”、“unknown”。
注意,typeof爲“unknown”的情況特別罕見,在微軟的文檔中幾乎沒有提到,筆者也是在“typeof TdcObj.recordset.recordcount”的時候才發現這個特例的。
而對象的constructor屬性值則視情況而論,詳細請見表3-2。
表3-2 typeof和constructor的比較
變 量 |
typeof返回的都是String串 |
constructor返回的是對象 |
其他說明 |
//這裏省略了( ) var test = new Object; //上面等同於 var test = {}; |
object |
Object |
任何自定義對象(Object)的typeof都是object |
var test = new Array(123,456); //上面等同於 var test = [123,456]; |
object |
Array |
|
var test = function(){}; //上面等同於 var test = new Function(); |
Function |
Function |
但是請注意,如果是 var T = new test(); 則typeof oT等於object |
function fnMyTest(){} //這裏省略了() var test = new fnMyTest;
|
object |
fnMyTest |
要特別注意的是,自定義函數的constructor等於這個定義的函數對象,又,例如: (new Date).constructor等於Date,它的typeof等於object |
var test = null; |
object |
發生錯誤,無法獲取constructor,雖然它的tyepof是“object”,這就是它的特殊性 |
這種情況是非常特殊的,讀者朋友要特別小心。在程序運行過程中常常會發生這樣的情況的,在你並不知道已經爲null的情況下卻還在求test.constructor的內容 |
var test = undefined; |
undefined |
同null一樣,會發生錯誤,因爲它不是一個有效的變量或對象 |
|
var test = 9897; |
number |
Number |
|
var test = “My Test String”; |
string |
String |
|