鸟食轩
Microsoft .NET[C#] MVP 2003
随笔 - 332, 文章 - 870, 评论 - 5722, 引用 - 356
JS类定义原型方法的两种实现的区别
我们知道,给JavaScript类添加原形(prototype)方法是很简单的。而且常用的有下面这两种方法,可是这两种方法在使用时有区别吗?
JScript Class:
function
JSClass()
{
}
Extends prototype method:
JSClass.prototype.MethodA
=
function
()
{
};
Or
function
=
JSClass.prototype.MethodA()
{
};
绿色通道:
好文要顶
关注我
收藏该文
与我联系
posted on 2005-03-01 10:50
birdshome
阅读(13087)
评论(15)
编辑
收藏
评论
1160510
#1楼
[
楼主
]
回复
引用
查看
我先来说一个简单的区别:这两个方法导入的原型方法,第一个是一个匿名方法;第二个方法有方法名"JSClass.prototype.MethodA"。
2005-03-01 10:52
|
birdshome
#2楼
回复
引用
查看
<BODY>
<script>
function JSClass()
{
}
function = JSClass.prototype.MethodA()
{
};
</script>
</BODY>
提示出错乜。
2005-03-01 13:51
|
阮
#3楼
[
楼主
]
回复
引用
查看
faint,我发现FreeTextBox修改少量数据(一两个字符)提交有时会没有效果:(
我那个是手误多写了个"=",可是我记得我修改过了的。
2005-03-01 14:00
|
birdshome
#4楼
[
楼主
]
回复
引用
查看
其实这两个原形定义方式可以简化一下来讨论,先把它们看作是两个函数,如下:
Foo1();
function
Foo1()
{
alert('This is Foo1.');
}
和
Foo2();
var
Foo2
=
function
()
{
alert('This is Foo2.');
}
运行第一个显然是不会有任何错误的,可是运行第二个就有问题了,这时系统会说:Microsoft JScript runtime error: Object expected
。这就是说函数定义(Foo1)在脚本解析器中有最高的初始化优先级,这个很好理解。如果不优先处理函数,那么对于函数中的函数调用就没有办法处理了,假使我们先定fn1()再定义fn2(),却从fn1中调fn2,那么就通不过解析了。为什么Foo2不能被初始化,Foo2的定义根本不是函数定义,它是一个标准的赋值语句,之所以能象标准函数一样的使用Foo2(Foo2()),完全是因为它指向的是一个函数对象的实例而已。
2005-03-03 22:17
|
birdshome
#5楼
[
楼主
]
回复
引用
查看
再来看原形方法导入里的两种方式,就很简单了。并且不同的执行优先循序,也决了它们在使用中的不同,看如下示例:
<
script
language
="javascript"
>
function
NormalClass()
{
this
.m_Property1
=
'P1
in
Normal Class.';
this
.m_Property2
=
'P2
in
Normal Class.';
this
.toString
=
function
()
{
return
'[class NormalClass]';
}
return
new
InnerClass();
function
InnerClass()
{
this
.m_Property1
=
'P1
in
Inner Class.';
this
.m_Property2
=
'P2
in
Inner Class.';
this
.toString
=
function
()
{
return
'[class InnerClass]';
}
}
InnerClass.prototype.Method1
=
function
()
{
alert(
this
.m_Property1);
}
;
function
InnerClass.prototype.Method2()
{
alert(
this
.m_Property2);
}
;
}
</
script
>
执行:
var
nc
=
new
NormalClass();
nc.Method1();
nc.Method2();
是什么效果?为什么?
2005-03-03 22:21
|
birdshome
#6楼
[
楼主
]
回复
引用
查看
最后结果居然是nc.Method1()没有定义,nc.Method2()运行正常。
其实不奇怪了,
InnerClass.prototype.Method1
=
function
()
依赖于赋值语句的执行,而
function
InnerClass.prototype.Method2()
以最高优先级被脚本引擎初始化。
2005-03-05 02:43
|
birdshome
#7楼
回复
引用
我在Antechinus JavaScript Editor测试你的代码在:
function InnerClass.prototype.Method2()报错,
SyntaxError:missing( before formal parameters See: .prototype.Method2(
2005-05-10 17:11
|
Error
#8楼
回复
引用
@Error
用IE来试过吗?
2005-05-10 17:30
|
birdshome
#9楼
回复
引用
我用FF也是一样的报错: missing( before formal parameters See: .prototype.Method2(
2006-08-19 22:40
|
jzz[未注册用户]
#10楼
回复
引用
return new InnerClass(); 把这行移到
function InnerClass.prototype.Method2()
{
alert(this.m_Property2);
};
后面ie执行正常.FF报错: missing( before formal parameters See: .prototype.Method2(
ie是安顺序执行下来的,而NS系列不是!
FF在执行到function InnerClass.prototype.Method2() 这个的时候它根本不知道有这个InnerClass类,自然就不能无缘无故的来个prototype.xxx的东东
2006-11-13 00:57
|
Doutu[未注册用户]
#11楼
[
楼主
]
回复
引用
查看
@Doutu
把return new InnerClass();放到function InnerClass.prototype.Method2()这个方法之后,就完全违背了我编写这个示例的初衷。这个示例恰好说明了,IE对function foo()这种函数定义格式有较高的解析优先级,而foo = function()只是一个普通的赋值语句。至于ff中的情况我没有研究过,既然你说ff找不到return后的InnerClass,那么就说明是顺序的解析function foo()这种还属定义格式的。
2006-11-13 01:29
|
birdshome
#12楼
回复
引用
唉。可怜的只会用ie的人呀。 function x.y.z() {} 的写法根本就是不标准的写法,只有ie支持,其他js引擎中如ff或opera都会报错。符合标准的写法只有 x.y.z = function () {};
当然,就语法层面来说,我挺喜欢这种写法的,希望以后的标准能采纳这种写法。
2006-11-28 11:04
|
hax[未注册用户]
#13楼
回复
引用
查看
呵呵 hax说得对啊。 只有ie才会像妈妈一样包容孩子的各种错误
标准的写法只有 x.y.z = function () {};
其实,ie还支持更诡异的写法。
看看这个
function window::onload(){
alert("go_rush")
}
2006-11-28 14:39
|
Go_Rush
#14楼
[
楼主
]
回复
引用
查看
@hax
标准再好,也是为人服务的,争论这个是学院派和工程派之间的事情,我们实现好我们自己系统就可以了,何必过分在神仙打架。
// 你的评论其实挺好的。Sigh,只可惜因为IE,我好可怜啊~~~
2006-11-28 18:04
|
birdshome
#15楼
回复
引用
查看
Mark
2008-04-18 22:15
|
簡簡單單..
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
最想要的Entity Framework功能
·
专访Jeffrey Richter:Windows 8是微软的重中之重
·
《福布斯》:谷歌进军硬件产品 难撼动苹果地位
·
美国空军拟最多购买1.8万台iPad 2
·
分析称专利之争让谷歌苹果两败俱伤
»
更多新闻...
最新知识库文章
:
·
高级编程语言的发展历程
·
如何学习一门新的编程语言?
·
学习不同编程语言的重要性
·
为什么我喜欢富于表达性的编程语言
·
计算机专业的女生为什么要学编程
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
导航
博客园
首页
新随笔
联系
订阅
管理
公告
Invert
原创
技术文章和心得,
转载
必须注明来源
"博客园"
!
贴子以"现状"提供,且没有任何担保,同时也没有授予任何权利。
昵称:
birdshome
园龄:
7年10个月
荣誉:
推荐博客
粉丝:
73
关注:
3
搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
我的标签
Nokia 6300
(2)
fan
(1)
qq
(1)
腾讯
(1)
输入法
(1)
隐私
(1)
随笔分类
(337)
.NET的私有工具类(2)
(rss)
.NET技术开发相关(34)
(rss)
Asp.net控件开发(14)
(rss)
Debug中的滑铁卢(9)
(rss)
Enjoy Computer :)(27)
(rss)
Jscript&Dhtml开发(162)
(rss)
技术区里的非技术(49)
(rss)
开发中遇到的虫子(14)
(rss)
其它编程相关内容(16)
(rss)
商务智能(BI)开发(10)
(rss)
文章分类
(147)
北京的幸福生活(29)
(rss)
不得不转载(19)
(rss)
乖乖的文章(6)
(rss)
那时还没有blog(4)
(rss)
那是相当八卦(10)
(rss)
手机短信息(1)
(rss)
我们的文章(40)
(rss)
珍贵照片的背景(4)
(rss)
重庆的幸福生活(34)
(rss)
相册
2005 Kick Off @ 涞滩
2006 Kick Off @ 钓鱼城
2006 Offsite @ 四面山
2006 Wedding @ 昆明
2007 Marriage @ 哈尔滨
2007 Offsite @ Thailand
2007 Offsite @ 海南云天
2007 Training @ Seattle
2007 Travelling @ 云南
2008 Travelling @ 天津
乱七八糟的收集
Ex-Colleagues
Jason Lei's Space
.Net Life
(rss)
Jasper
(rss)
Michelles Space
xingd.net
(rss)
玻璃缸
(rss)
短鲷生活
海阔天空
录一室
(rss)
完美的泡菜
(rss)
怡红公子
(rss)
竹叶尖的BLOG
常用链接
Engadget 中文版
PDFCHM eBooks
SitePoint Forums
The Code Project
安利上海直销店
哈尔滨工业大学
哈工大紫丁香
海归论坛
(rss)
沙坪坝区中医院
兄弟情深
没有可乐的日子
葡萄树下不乘凉
(rss)
斯普特尼克
猪头小队长
(rss)
积分与排名
积分 - 3145044
排名 - 6
最新评论
阅读排行榜
推荐排行榜