您的位置:首页 > 移动开发 > Objective-C

js中的Object和function的一些比较,typeof和constructor总结 区别

2010-11-09 17:52 447 查看
面向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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐