由浅到深了解JavaScript类第2/2页
更新时间:2007年01月11日 00:00:00 作者:
我们最近常谈javascript的OO,但请大家要格外记住,javascript 不是“面向对象”的语言,最多只能说是“基于对象”。
“面向对象”和“基于对象”之间的差别,我一时很难找到 简单且又准确 的词汇来描述。
谈到 “面向对象”,我们首先可能会想到 c++,其次是 java,后来再就是 dot net ,(其他的偏门语言我们这里不多讨论)
其实 c++ 在贯彻 “面向对象”思想方面 是不及 java 的,因为它还存在大量 “过程”型的东西。 java 放弃了多重继承,重载算子等“繁索不实用”的东西,把设计重点放在interface(接口)上,不仅简化的编程者的工作繁琐度,而且让整个框架看上去更加清晰。最重要的是 java 中所有的东西都是以类的形式存在的,没有第二种形式。至于后来dotnet 中的 c# ,看起来就像是 ms 牌子的 java.
扯远了,回到 javascript 上来
说Javascript不是面向对象 不仅仅是 说 它没有真正意义上实现:抽象对象、 继承、重载等等面向对象的功能
而是说 javascript中的“类” 并不是真正广义上“类”的概念。类原本是只是一个抽象定义,而javascript中通过“Function” 定义的类,本质上却是一个“对象”!
而且javascript的语法域并不是整个 IE 进程,而是以 Window对象为单位的。
不同Window对象下相同的Function定义,并不是同一个“类”。
比如:
a.htm 中你定义了一个 A 类 function A(){} , b.htm 中你也相同定义了这个 A 类 function A(){}
在 a.htm 中你创建了一个实例: var a = new A();
你在 b.htm 中得到了 a.htm 的句柄 winAhandle
然后你得到 a.htm 中 a 实例的引用
var a = winAhandle.a;
你会发现 a instanceof A 是 false,换成 a instanceof winAhandle.A 便是 true 了
原因很简单,b.htm 中的A 类并不等同于 a.htm 中的A类,这种“类”的语法域只限于 一个相同的 Window 对象下(同一个Window对象并不仅是指同一个页面)
这显然是有悖于 类是一个广义上的抽象定义 这种概念了
会 VB 的人,也应该了解:VB4之后,VB.NET之前的 VB(包括VBS)中的类,也是这种情况,虽然它是通过 Class 的方式定义的。
比如你 new A 放到 session 里,下一次从 session 中取出来,便不是原先那个对象了。
其实就是因为语法域不同,前一次定义的类,并不能保留到这一次,解析器不知道他是什么东西,故不能还原了
顺便提一下 javascript 中继承方式是采用的 原型(prototype)继承,详细的介绍,大家可以去找这本书看看
《Design Patterns Elements of Reusable Object Oriented Soffware》
中文版好像叫 《可复用面向对象的设计模式》
一本好书!!!
javascript中没有多重继承。多重继承在面向对象中并不是必须的。虽然多重继承的重用性更好,但会导致类之间的关系过于复杂。
一般来说,一样事物,我们通常可以认为它主要是某一类事物的衍生物,单一继承就够用了,至于其他的特性,我们可以借助接口来定义。
javascript中也没有接口概念,javascript不需要接口,因为它是一门解释型的语言,不对实参的类型做预校验。作为一个参数对象,有没有某个方法,加载过程中并不去检查,直到运行时,有则调用,无则异常。不需要强制性声明继承了哪个接口才能做为参数调用。
但实际中,我们还是需要设计一些接口,主要是出于view的考虑,整个框架容易被读懂!
“面向对象”和“基于对象”之间的差别,我一时很难找到 简单且又准确 的词汇来描述。
谈到 “面向对象”,我们首先可能会想到 c++,其次是 java,后来再就是 dot net ,(其他的偏门语言我们这里不多讨论)
其实 c++ 在贯彻 “面向对象”思想方面 是不及 java 的,因为它还存在大量 “过程”型的东西。 java 放弃了多重继承,重载算子等“繁索不实用”的东西,把设计重点放在interface(接口)上,不仅简化的编程者的工作繁琐度,而且让整个框架看上去更加清晰。最重要的是 java 中所有的东西都是以类的形式存在的,没有第二种形式。至于后来dotnet 中的 c# ,看起来就像是 ms 牌子的 java.
扯远了,回到 javascript 上来
说Javascript不是面向对象 不仅仅是 说 它没有真正意义上实现:抽象对象、 继承、重载等等面向对象的功能
而是说 javascript中的“类” 并不是真正广义上“类”的概念。类原本是只是一个抽象定义,而javascript中通过“Function” 定义的类,本质上却是一个“对象”!
而且javascript的语法域并不是整个 IE 进程,而是以 Window对象为单位的。
不同Window对象下相同的Function定义,并不是同一个“类”。
比如:
a.htm 中你定义了一个 A 类 function A(){} , b.htm 中你也相同定义了这个 A 类 function A(){}
在 a.htm 中你创建了一个实例: var a = new A();
你在 b.htm 中得到了 a.htm 的句柄 winAhandle
然后你得到 a.htm 中 a 实例的引用
var a = winAhandle.a;
你会发现 a instanceof A 是 false,换成 a instanceof winAhandle.A 便是 true 了
原因很简单,b.htm 中的A 类并不等同于 a.htm 中的A类,这种“类”的语法域只限于 一个相同的 Window 对象下(同一个Window对象并不仅是指同一个页面)
这显然是有悖于 类是一个广义上的抽象定义 这种概念了
会 VB 的人,也应该了解:VB4之后,VB.NET之前的 VB(包括VBS)中的类,也是这种情况,虽然它是通过 Class 的方式定义的。
比如你 new A 放到 session 里,下一次从 session 中取出来,便不是原先那个对象了。
其实就是因为语法域不同,前一次定义的类,并不能保留到这一次,解析器不知道他是什么东西,故不能还原了
顺便提一下 javascript 中继承方式是采用的 原型(prototype)继承,详细的介绍,大家可以去找这本书看看
《Design Patterns Elements of Reusable Object Oriented Soffware》
中文版好像叫 《可复用面向对象的设计模式》
一本好书!!!
javascript中没有多重继承。多重继承在面向对象中并不是必须的。虽然多重继承的重用性更好,但会导致类之间的关系过于复杂。
一般来说,一样事物,我们通常可以认为它主要是某一类事物的衍生物,单一继承就够用了,至于其他的特性,我们可以借助接口来定义。
javascript中也没有接口概念,javascript不需要接口,因为它是一门解释型的语言,不对实参的类型做预校验。作为一个参数对象,有没有某个方法,加载过程中并不去检查,直到运行时,有则调用,无则异常。不需要强制性声明继承了哪个接口才能做为参数调用。
但实际中,我们还是需要设计一些接口,主要是出于view的考虑,整个框架容易被读懂!
相关文章
BootStrap中关于Select下拉框选择触发事件及扩展
Select下拉框的问题,想在选择一个选项后,前台显示做出变动,并且知道选择的是第几个选项。 怎么解决这个问题呢?下面小编给大家带来了BootStrap中关于Select下拉框选择触发事件及扩展,需要的朋友参考下吧2016-11-11
深入理解关于javascript中apply()和call()方法的区别
下面小编就为大家带来一篇深入理解关于javascript中apply()和call()方法的区别。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2016-04-04
Bootstrap弹出框(modal)垂直居中的问题及解决方案详解
这篇文章主要介绍了Bootstrap弹出框(modal)垂直居中的问题及解决方案详解的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下2016-06-06


最新评论