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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值