面向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 |
|