职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 1633|回复: 9

JavaScript中的OO思想

[复制链接]
醉倚西风 发表于 2011-9-5 11:03 | 显示全部楼层 |阅读模式
曾经有人问我,为什么使用Array.prototype.func()比func(ArrayInstance)好?我只是简单回答因为Array.prototype.func()应用了面向对象的思想,能易于人们理解。我刚开始接触JavaScript的时候,很喜欢写func(param)这样的函数,虽然我知道JavaScript里有对象的概念,但不明白为什么要那么麻烦把函数写成方法呢?后来我仔细想了这个问题,觉得使用prototype能让我们少做很多事情。

作为一个程序员,我们需要对自己写的代码负责,我们写出的每一个函数都是要给别人使用的,每个人对于函数的理解及使用方式都是不同的,因此我们需要考虑到用户的不同使用方式,如函数中带参数我们就要考虑使用此函数的人会传什么样的参数,并对不同参数应该做什么进行处理,而不是只管理想的情况。

而JavaScript相对于Java、C++等语言来说,给了我们很多自由,如弱类型、类型自动转换、函数参数随意传递等,但这些在给我们自由的同时,也需要我们做更多的事,比如说判断参数类型等。

因此,如果我们写func(param)的时候,我们就要对用户传入参数作判断工作,考虑如用户不传参数、用户传过多参数等情况,这对于我们来说需要花一定的精力和时间,而对于程序来说在运行时也要作很多判断工作。

假如我们把函数变成某个对象的方法,这样我们就能少做很多以上提到的一些不必要的工作,而把更多时间花在别的更重要的地方。

因此我得出一个结论是,尽量将函数都换成对象的方法,面向对象思想对于JavaScript来说非常重要。

ksdal 发表于 2011-9-5 11:04 | 显示全部楼层
JS OOP 理解好了真的可以给我们带来很多方便

能文能武 发表于 2011-9-5 11:04 | 显示全部楼层
写成Array.prototype.func()就不需要对参数进行判断了?求指点

紫衿 发表于 2011-9-5 11:04 | 显示全部楼层
axiheyhey 写道
写成Array.prototype.func()就不需要对参数进行判断了?求指点

使用的方法不同,
写成Array.prototype.func()可以这样用
  
[1,2,3].func()  

[1,2,3].func()
而写成func(arr)要这样用
  
func([1,2,3,])  

func([1,2,3,])

月上萧萧 发表于 2011-9-5 11:04 | 显示全部楼层
云天水瓶 写道
axiheyhey 写道
写成Array.prototype.func()就不需要对参数进行判断了?求指点

使用的方法不同,
写成Array.prototype.func()可以这样用
  
[1,2,3].func()  

[1,2,3].func()
而写成func(arr)要这样用
  
func([1,2,3,])  

func([1,2,3,])

还是不甚理解,楼主可否给一个详细点得例子?谢谢了

叫我小乖 发表于 2011-9-5 11:05 | 显示全部楼层
云天水瓶 写道

使用的方法不同,
写成Array.prototype.func()可以这样用
  
[1,2,3].func()  

[1,2,3].func()
而写成func(arr)要这样用
  
func([1,2,3,])  

func([1,2,3,])

这样只是使用方法不同而已,该做参数判断还是要做的吧?当然写成[1,2,3].func()的话[1,2,3]应该不算参数了。

我的理解是Array.prototype.func()是定义了Array对象的一个方法属性,也就是说func()是Array对象专用的,其他非Array对象不可用。
如果我理解有误,能否给点更详细的解释

江南枫 发表于 2011-9-5 11:05 | 显示全部楼层
chenkuntian 写道

还是不甚理解,楼主可否给一个详细点得例子?谢谢了

呵呵,同感啊

天上智喜 发表于 2011-9-5 11:05 | 显示全部楼层
云天水瓶 写道
axiheyhey 写道
写成Array.prototype.func()就不需要对参数进行判断了?求指点

使用的方法不同,
写成Array.prototype.func()可以这样用
  
[1,2,3].func()  

[1,2,3].func()
而写成func(arr)要这样用
  
func([1,2,3,])  

func([1,2,3,])
这样写是能起作用,但面向对象不是用来做这个的。应该从能否做到高内聚低耦合、能否复用、是否易于扩展等角度来考虑,这点js和java是共通的。

broken 发表于 2011-9-5 11:05 | 显示全部楼层
hyj1254 写道
云天水瓶 写道
axiheyhey 写道
写成Array.prototype.func()就不需要对参数进行判断了?求指点

使用的方法不同,
写成Array.prototype.func()可以这样用
  
[1,2,3].func()  

[1,2,3].func()
而写成func(arr)要这样用
  
func([1,2,3,])  

func([1,2,3,])
这样写是能起作用,但面向对象不是用来做这个的。应该从能否做到高内聚低耦合、能否复用、是否易于扩展等角度来考虑,这点js和java是共通的。

+1   

Jethro 发表于 2011-9-5 11:05 | 显示全部楼层
为什么使用Array.prototype.func()比func(ArrayInstance)好?
如果把Array换成自己定义function,这句话是对的。但是如果是Array,请三思。
原生对象的原型链尽量不要扩展。这是常识!!!!!

原因在于,如果你在05年定义了一个Array.prototype.indexOf,完成了一个功能。然后在09年的时候,ECMAScript5标准横空出世,也定义了一个Array.prototype.indexOf。那你写的这个,就把标准的给覆盖掉了。你这样做,增加了项目维护的成本,得不偿失。
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-19 19:10 , Processed in 0.120406 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表