日期:2014-05-16 浏览次数:20445 次
探讨一下,如有纰漏请指正.
认识在前面:先给出我们讨论的结果
===========================================
javascript是基于原型(prototype-based )的语言.
javascript具有面向对象(Object-Oriented )的编程风格.
变量不一定是对象(undefined,null等就是特例,但是NaN是个对象)
对象一定有值,也有成员(函数,属性)
Object不是顶级的,因为可以delete Object
顶级 的有:
Array Object
Boolean Object
Date Object
Function Object
Math Object
Number Object
RegExp Object
String Object
new 运算符具有一定的魔术性,这个说法我语言上还组织不好.
==========================================
首先我用了词:原型
马上您就知道为什么这么说了.
javascript是基于对象(Object-based )的吗?不是
javascript是面向对象(Object-Oriented )的吗?是 ,要清楚这句话指的是编程方法类似面向对象的编程,但是也有很多不同的地方.
那我们看看Mozilla官方的说法
?javascript是基于原型(prototype-based )的语言.
?
那么我们在描述,研究这个语言的时候就会牵扯到这几个问题.
值和对象 :
var obj={}; var num=9; var str='string' var arr=[];
?很明显上面的几个变量都是一个对象,那变量一定是对象吗 ?
var foo;
?foo是一个变量,但是foo不是对象.对象有个事实上 的特征就是,对象一定有成员 (属性或方法).
?foo就没有任何成员,他的值是undefined ,而undefined 的定义是:
?也就是说undefined 是一个顶级共有属性,用关键字描述undefined 其实更确切.
?现在我们举几个值对象( javascript的其他类型的还有,就不提了)
'isstring'.constructor;//String() true.constructor;//Boolean() 9.0.constructor;//Number();这下对了吧csf178 (9).constructor;//Number();匿名对象 9.constructor;//SyntaxError;经csf178指正,这是浮点数转换造成的语法冲突 [].constructor;//Array() {}.constructor;//fireFox :SyntaxError;IE : Object();注意javascript定义中{}是代码块和对象定义,不是Operator ({}).constructor;//Object();匿名对象
?其实值对象这个说法不是很合适.就像上面的前3个确实是值.第4个(9)其实是一个匿名的Number对象 ,
但是接下来的两句就有意思了.{}和[]竟然还有如此的区别.而且fireFox和IE实现也不同.(其实从优先级上可以找到一些答案,可惜不同实现有差异)
Object Literals 中明确指出{}.xxx这种用法是错误的,所以fireFox出SyntaError是正常的.MS的jscript文档我没有看过,不知道如何解释这个.
那我们如何来评论javascript的这些特性呢?
抛弃面向对象这个说法吧,javascript真的不适合. javascript就是这样的不严格,但是很实用.
经csf178指正后,看来javascript仍旧是OO的.但是是prototype-based 的OO,不是Class-based的OO.
也就是说在javascript里所有的对象都有原型,官方给出的原型
(好在我写这个帖子的时候就是为了要搞清楚这3者的关系)
总结:变量不一定指向对象 (貌似废话),对象一定有值
原型 :
是对象一定有原型constructor
这一点从可以从javascript的constructor的定义中找到根据.
请注意上面例子中所有的constructor都是以函数给出的,其实
<