js中的Object和function的一些比較,typeof和constructor總結 區別

面向js的高級用戶,相信都會考慮到這些問題。

Object和Function有着異曲同工之妙,它們都可以有屬性和方法。不過卻有着極大的差別,

Object和function的一些比較

   

Object

Function

定義後

不能再使用new創建對象實例,可以賦值給其他變量,多個變量同時引用一個對象,或者克隆對象

可以使用new創建多個對象實例,使用時互不影響,但是使用內存也會更多

多態性

具備

具備

繼承

無法繼承,除非用複製的方式來實現

可以實現

toStringvalueOf

如果你不實現它的代碼,別人無法通過toStringvalueOf查看到你的代碼

默認情況下,toStringvalueOf是可以看到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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章