令人惊奇的javascript面向对象(一)
有种流行的说法:javascript是基于对象和事件驱动的。应该怎样理解“基于对象”的意思呢?
《精通javascript》告诉我们,对象是javascript的基础,甚至说“javascript这门语言就是完全面向对象的”。
我不知道应该怎样评判这样的说法,javascript确实有面向对象的特性,但是他的表现形式却和其他面向对象编程语言大相径庭。
在谈javascript的面向对象之前,我想先说说javascript的作用域问题。我想只有搞清楚这个问题,才能更好地理解接下来的内容。我将会用自己的理解将javascript中的面向对象特性与一般面向对象程序设计语言(java/c++等)的一些称谓对应起来。
首先理清两个问题:
1.什么是全局变量?
javascript中的全局变量实际上指的是window对象下的对象属性。
2.作用域划分。
javascript中的作用域是基于上下文,以函数进行划分的,而不是由块(block)划分的。
接下来看一个例子(原例来自《精通javascript》,有改动):
script type="text/javascript">
// 设置全局变量foo,并置为“test”
var foo = "test";
if ( true )
{
// 注意:现在还在全局作用域中
var foo = "new test";
}
// 如我们所见,现在foo等于'new test'了
alert( foo );
// 创建一个会修改变量foo的新函数
function test()
{
//函数内部定义变量不影响全局变量
var foo = "old test";
//隐式定义全局变量
val = 'hello!';
}
// 然而在调用test函数时,foo只在函数作用域内起作用
test();
// 确认foo还是等于'new test'
alert( foo );
// 全局变量实际是window下的属性
alert( window.foo );
// 函数内部隐式定义的全局变量
alert(val);
/script>
现在你大概对javascript的作用域有了一个初步的理解。
要强调的两点是:
1.在同一作用域中,javascript是允许变量的重复定义的,并且后一个定义将覆盖前一个定义。
2.函数内部如果不加关键字var而定义的变量,默认为全局变量。
今天先写到这里,明天我将会整理javascript中一些面向对象特性与大家分享。
欢迎交流前端开发技术!
标签: javascript, 面向对象, 作用域
绿色通道:好文要顶关注我收藏该文与我联系
posted @ 2008-07-22 01:17 东捣cy 阅读(6839) 评论(26)编辑 收藏
发表评论
2134829
回复 引用 查看
#1楼2008-07-22 02:23 | 真 oo无双
javascript的面向對象很怪
我一直很難習慣 呵呵
我覺得面向對象重要的是多態
希望在你的文章看到關於javascript多態的部分
關注中
回复 引用 查看
#2楼2008-07-22 02:41 | ocean
javascript不是面向对象的语言,我们通常只是说“基于对象”,为什么说“基于对象”而不是“面向对象”,很大的问题就是“面向对象”的很多东东javascript是没有的。比如一楼所说的多态,另外js里面也是没有继承的。我们说“javascript”基于对象,原因在与javascript可以定义对象,并且可以基于这个对象做一些方法扩展。
回复 引用 查看
#3楼2008-07-22 07:56 | 真 oo无双
@ocean
繼承是有
obj.prototype = new foo();
這樣obj就繼承foo object了
至於多態,我昨天想了想,由於javascript是動態語言,沒有型別,所以沒有c++、c#、java這種強型別的問題,也就是說,javascript天生就是多態
這要看樓主怎麼講解了
關注中
回复 引用 查看
#4楼2008-07-22 08:26 | cloudgamer
作用域确实是js的难点之一
主要应用在闭包
回复 引用 查看
#5楼2008-07-22 08:27 | u2u
不错
回复 引用 查看
#6楼2008-07-22 08:46 | willson
javascript 不是面向对象语言啊~
同意2楼!
回复 引用 查看
#7楼2008-07-22 08:54 | 小猪凯
精通javascript这本书如何?
回复 引用 查看
#8楼2008-07-22 09:27 | 斧头帮少帮主
同意2楼...
回复 引用 查看
#9楼2008-07-22 09:29 | bmrxntfj
如何评判它是不是,要从根本上去判断,而不是学了面向对象,就给自己下套子,用面向对象去理解一样东西。太束缚了。
回复 引用 查看
#10楼[楼主]2008-07-22 10:26 | 东捣cy
@cloudgamer
关于闭包我理解不多,有些地方还是有疑问。
接下来的文章我也会谈谈闭包的问题,希望大家一起讨论~
回复 引用 查看
#11楼2008-07-22 10:33 | 傲然林
这里甚是火热喔。
回复 引用
#12楼2008-07-22 10:36 | 吃请客[未注册用户]
的确很怪, 先做着吧
回复 引用 查看
#13楼[楼主]2008-07-22 10:37 | 东捣cy
@真 oo无双
javascript所谓的面向对象特性确实很怪异,所以我宁愿相信javascript原本并不是被设计成面向对象的,而它的某些特性却足以让忠于面向对象思想的程序员在某种程度上将其“面向对象”化。
在多态的问题上,我和你的理解基本相同。由于javascript是无类型的,因此它的多态问题也就转变成了对参数长度和参数类型的判断问题了,而不是像java或者c++一样通过重载等方式实现多态。
回复 引用 查看
#14楼2008-07-22 10:41 | tobin
@ocean
js是可以模仿继承的,通过call和apply可以实现继承,改变this指针
回复 引用 查看
#15楼2008-07-22 13:33 | 真 oo无双
@东捣cy
期待你的面向對向的javascript
回复 引用 查看
#16楼2008-07-22 13:50 | ocean
@ 真 oo无双
你说的这种属于伪继承,不属于真正面向对象意义上说的继承。
回复 引用 查看
#17楼2008-07-22 15:41 | 火无极
这个例子给的太好了
回复 引用
#18楼2008-07-23 21:31 | wicket521[未注册用户]
小心this的使用
function test()
{
//函数内部定义变量不影响全局变量
this.foo = "old test";
//隐式定义全局变量
val = 'hello!';
}
回复 引用
#19楼2008-07-24 08:35 | welcome58[未注册用户]
同意13楼楼主的意思
大家都希望用面向对象的思路来运用javascript,但它天生在这方面就存在不足
回复 引用 查看
#20楼2008-07-24 11:36 | cloudgamer
js的面向对象 闭包和函数式编程是js最难的也是最吸引人的地方
回复 引用 查看
#21楼2008-07-24 11:56 | zhuang miao
非逼毛驴上树~
回复 引用 查看
#22楼[楼主]2008-07-27 12:20 | 东捣cy
@zhuang miao
不是逼毛驴上树。能上树是一种能力,而我们如果能使毛驴去拥有这样一种能力,那你的毛驴就更加强大了。
回复 引用
#23楼2008-10-19 11:56 | oille[未注册用户]
js的继承是有的
一般为伪装模式、替代模式 还有混合模式,用的最多的是最后一种,
不过js的继承很怪异,不同于java中的继承,js是以集合模式继承的
回复 引用
#24楼2008-10-19 11:58 | oille[未注册用户]
ajax 技术最重要的一点就是用js对象
回复 引用 查看
#25楼2010-10-22 11:44 | 毛球
引用有种流行的说法:javascript是基于对象和事件驱动的。应该怎样理解“基于对象”的意思呢?
《精通javascript》告诉我们,对象是javascript的基础,甚至说“javascript这门语言就是完全面向对象的”。
准确的说:js是基于原型的语言,具有面向对象的编程风格
回复 引用 查看
#26楼2011-06-25 11:27 | leijuanjuan
var a="1"
function d(){
alert(a)
var a="w;
}
d()
这个为什么是udefined?
注册用户登录后才能发表评论,请 登录 或 注册,返回博客园首页。
最新it新闻:
» 更多新闻...
最新知识库文章:
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/