JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別評(píng)論很多
更新時(shí)間:2007年09月12日 21:26:32 作者:
我們知道,給JavaScript類添加原形(prototype)方法是很簡(jiǎn)單的。而且常用的有下面這兩種方法,可是這兩種方法在使用時(shí)有區(qū)別嗎?
JScript Class:
function JSClass()
{
}
Extends prototype method:
JSClass.prototype.MethodA = function()
{
};
Or
function = JSClass.prototype.MethodA()
{
};
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
我先來說一個(gè)簡(jiǎn)單的區(qū)別:這兩個(gè)方法導(dǎo)入的原型方法,第一個(gè)是一個(gè)匿名方法;第二個(gè)方法有方法名"JSClass.prototype.MethodA"。
2005-03-01 10:52 | birdshome
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
<BODY>
<script>
function JSClass()
{
}
function = JSClass.prototype.MethodA()
{
};
</script>
</BODY>
提示出錯(cuò)乜。
2005-03-01 13:51 | 阮
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
faint,我發(fā)現(xiàn)FreeTextBox修改少量數(shù)據(jù)(一兩個(gè)字符)提交有時(shí)會(huì)沒有效果:(
我那個(gè)是手誤多寫了個(gè)"=",可是我記得我修改過了的。
2005-03-01 14:00 | birdshome
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
其實(shí)這兩個(gè)原形定義方式可以簡(jiǎn)化一下來討論,先把它們看作是兩個(gè)函數(shù),如下:
Foo1();
function Foo1()
{
alert('This is Foo1.');
}
和 Foo2();
var Foo2 = function()
{
alert('This is Foo2.');
}
運(yùn)行第一個(gè)顯然是不會(huì)有任何錯(cuò)誤的,可是運(yùn)行第二個(gè)就有問題了,這時(shí)系統(tǒng)會(huì)說:Microsoft JScript runtime error: Object expected。這就是說函數(shù)定義(Foo1)在腳本解析器中有最高的初始化優(yōu)先級(jí),這個(gè)很好理解。如果不優(yōu)先處理函數(shù),那么對(duì)于函數(shù)中的函數(shù)調(diào)用就沒有辦法處理了,假使我們先定fn1()再定義fn2(),卻從fn1中調(diào)fn2,那么就通不過解析了。為什么Foo2不能被初始化,F(xiàn)oo2的定義根本不是函數(shù)定義,它是一個(gè)標(biāo)準(zhǔn)的賦值語句,之所以能象標(biāo)準(zhǔn)函數(shù)一樣的使用Foo2(Foo2()),完全是因?yàn)樗赶虻氖且粋€(gè)函數(shù)對(duì)象的實(shí)例而已。
2005-03-03 22:17 | birdshome
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
再來看原形方法導(dǎo)入里的兩種方式,就很簡(jiǎn)單了。并且不同的執(zhí)行優(yōu)先循序,也決了它們?cè)谑褂弥械牟煌?,看如下示例?
<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>
執(zhí)行:
var nc = new NormalClass();
nc.Method1();
nc.Method2();
是什么效果?為什么?
2005-03-03 22:21 | birdshome
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
最后結(jié)果居然是nc.Method1()沒有定義,nc.Method2()運(yùn)行正常。
其實(shí)不奇怪了,InnerClass.prototype.Method1 = function()依賴于賦值語句的執(zhí)行,而 function InnerClass.prototype.Method2() 以最高優(yōu)先級(jí)被腳本引擎初始化。
2005-03-05 02:43 | birdshome
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
我在Antechinus JavaScript Editor測(cè)試你的代碼在:
function InnerClass.prototype.Method2()報(bào)錯(cuò),
SyntaxError:missing( before formal parameters See: .prototype.Method2(
2005-05-10 17:11 | Error
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
@Error
用IE來試過嗎?
2005-05-10 17:30 | birdshome
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
我用FF也是一樣的報(bào)錯(cuò): missing( before formal parameters See: .prototype.Method2(
2006-08-19 22:40 | jzz
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
return new InnerClass(); 把這行移到
function InnerClass.prototype.Method2()
{
alert(this.m_Property2);
};
后面ie執(zhí)行正常.FF報(bào)錯(cuò): missing( before formal parameters See: .prototype.Method2(
ie是安順序執(zhí)行下來的,而NS系列不是!
FF在執(zhí)行到function InnerClass.prototype.Method2() 這個(gè)的時(shí)候它根本不知道有這個(gè)InnerClass類,自然就不能無緣無故的來個(gè)prototype.xxx的東東
2006-11-13 00:57 | Doutu
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
@Doutu
把return new InnerClass();放到function InnerClass.prototype.Method2()這個(gè)方法之后,就完全違背了我編寫這個(gè)示例的初衷。這個(gè)示例恰好說明了,IE對(duì)function foo()這種函數(shù)定義格式有較高的解析優(yōu)先級(jí),而foo = function()只是一個(gè)普通的賦值語句。至于ff中的情況我沒有研究過,既然你說ff找不到return后的InnerClass,那么就說明是順序的解析function foo()這種還屬定義格式的。
2006-11-13 01:29 | birdshome
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
唉。可憐的只會(huì)用ie的人呀。 function x.y.z() {} 的寫法根本就是不標(biāo)準(zhǔn)的寫法,只有ie支持,其他js引擎中如ff或opera都會(huì)報(bào)錯(cuò)。符合標(biāo)準(zhǔn)的寫法只有 x.y.z = function () {};
當(dāng)然,就語法層面來說,我挺喜歡這種寫法的,希望以后的標(biāo)準(zhǔn)能采納這種寫法。
2006-11-28 11:04 | hax
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
呵呵 hax說得對(duì)啊。 只有ie才會(huì)像媽媽一樣包容孩子的各種錯(cuò)誤
標(biāo)準(zhǔn)的寫法只有 x.y.z = function () {};
其實(shí),ie還支持更詭異的寫法。
看看這個(gè)
function window::onload(){
alert("go_rush")
}
2006-11-28 14:39 | Go_Rush
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
@hax
標(biāo)準(zhǔn)再好,也是為人服務(wù)的,爭(zhēng)論這個(gè)是學(xué)院派和工程派之間的事情,我們實(shí)現(xiàn)好我們自己系統(tǒng)就可以了,何必過分在神仙打架。
// 你的評(píng)論其實(shí)挺好的。Sigh,只可惜因?yàn)镮E,我好可憐啊~~~
JScript Class:
復(fù)制代碼 代碼如下:
function JSClass()
{
}
Extends prototype method:
復(fù)制代碼 代碼如下:
JSClass.prototype.MethodA = function()
{
};
Or
復(fù)制代碼 代碼如下:
function = JSClass.prototype.MethodA()
{
};
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
我先來說一個(gè)簡(jiǎn)單的區(qū)別:這兩個(gè)方法導(dǎo)入的原型方法,第一個(gè)是一個(gè)匿名方法;第二個(gè)方法有方法名"JSClass.prototype.MethodA"。
2005-03-01 10:52 | birdshome
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
<BODY>
<script>
function JSClass()
{
}
function = JSClass.prototype.MethodA()
{
};
</script>
</BODY>
提示出錯(cuò)乜。
2005-03-01 13:51 | 阮
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
faint,我發(fā)現(xiàn)FreeTextBox修改少量數(shù)據(jù)(一兩個(gè)字符)提交有時(shí)會(huì)沒有效果:(
我那個(gè)是手誤多寫了個(gè)"=",可是我記得我修改過了的。
2005-03-01 14:00 | birdshome
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
其實(shí)這兩個(gè)原形定義方式可以簡(jiǎn)化一下來討論,先把它們看作是兩個(gè)函數(shù),如下:
Foo1();
function Foo1()
{
alert('This is Foo1.');
}
和 Foo2();
var Foo2 = function()
{
alert('This is Foo2.');
}
運(yùn)行第一個(gè)顯然是不會(huì)有任何錯(cuò)誤的,可是運(yùn)行第二個(gè)就有問題了,這時(shí)系統(tǒng)會(huì)說:Microsoft JScript runtime error: Object expected。這就是說函數(shù)定義(Foo1)在腳本解析器中有最高的初始化優(yōu)先級(jí),這個(gè)很好理解。如果不優(yōu)先處理函數(shù),那么對(duì)于函數(shù)中的函數(shù)調(diào)用就沒有辦法處理了,假使我們先定fn1()再定義fn2(),卻從fn1中調(diào)fn2,那么就通不過解析了。為什么Foo2不能被初始化,F(xiàn)oo2的定義根本不是函數(shù)定義,它是一個(gè)標(biāo)準(zhǔn)的賦值語句,之所以能象標(biāo)準(zhǔn)函數(shù)一樣的使用Foo2(Foo2()),完全是因?yàn)樗赶虻氖且粋€(gè)函數(shù)對(duì)象的實(shí)例而已。
2005-03-03 22:17 | birdshome
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
再來看原形方法導(dǎo)入里的兩種方式,就很簡(jiǎn)單了。并且不同的執(zhí)行優(yōu)先循序,也決了它們?cè)谑褂弥械牟煌?,看如下示例?
<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>
執(zhí)行:
var nc = new NormalClass();
nc.Method1();
nc.Method2();
是什么效果?為什么?
2005-03-03 22:21 | birdshome
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
最后結(jié)果居然是nc.Method1()沒有定義,nc.Method2()運(yùn)行正常。
其實(shí)不奇怪了,InnerClass.prototype.Method1 = function()依賴于賦值語句的執(zhí)行,而 function InnerClass.prototype.Method2() 以最高優(yōu)先級(jí)被腳本引擎初始化。
2005-03-05 02:43 | birdshome
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
我在Antechinus JavaScript Editor測(cè)試你的代碼在:
function InnerClass.prototype.Method2()報(bào)錯(cuò),
SyntaxError:missing( before formal parameters See: .prototype.Method2(
2005-05-10 17:11 | Error
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
@Error
用IE來試過嗎?
2005-05-10 17:30 | birdshome
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
我用FF也是一樣的報(bào)錯(cuò): missing( before formal parameters See: .prototype.Method2(
2006-08-19 22:40 | jzz
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
return new InnerClass(); 把這行移到
function InnerClass.prototype.Method2()
{
alert(this.m_Property2);
};
后面ie執(zhí)行正常.FF報(bào)錯(cuò): missing( before formal parameters See: .prototype.Method2(
ie是安順序執(zhí)行下來的,而NS系列不是!
FF在執(zhí)行到function InnerClass.prototype.Method2() 這個(gè)的時(shí)候它根本不知道有這個(gè)InnerClass類,自然就不能無緣無故的來個(gè)prototype.xxx的東東
2006-11-13 00:57 | Doutu
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
@Doutu
把return new InnerClass();放到function InnerClass.prototype.Method2()這個(gè)方法之后,就完全違背了我編寫這個(gè)示例的初衷。這個(gè)示例恰好說明了,IE對(duì)function foo()這種函數(shù)定義格式有較高的解析優(yōu)先級(jí),而foo = function()只是一個(gè)普通的賦值語句。至于ff中的情況我沒有研究過,既然你說ff找不到return后的InnerClass,那么就說明是順序的解析function foo()這種還屬定義格式的。
2006-11-13 01:29 | birdshome
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
唉。可憐的只會(huì)用ie的人呀。 function x.y.z() {} 的寫法根本就是不標(biāo)準(zhǔn)的寫法,只有ie支持,其他js引擎中如ff或opera都會(huì)報(bào)錯(cuò)。符合標(biāo)準(zhǔn)的寫法只有 x.y.z = function () {};
當(dāng)然,就語法層面來說,我挺喜歡這種寫法的,希望以后的標(biāo)準(zhǔn)能采納這種寫法。
2006-11-28 11:04 | hax
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
呵呵 hax說得對(duì)啊。 只有ie才會(huì)像媽媽一樣包容孩子的各種錯(cuò)誤
標(biāo)準(zhǔn)的寫法只有 x.y.z = function () {};
其實(shí),ie還支持更詭異的寫法。
看看這個(gè)
function window::onload(){
alert("go_rush")
}
2006-11-28 14:39 | Go_Rush
# re: JS類定義原型方法的兩種實(shí)現(xiàn)的區(qū)別 回復(fù) 更多評(píng)論
@hax
標(biāo)準(zhǔn)再好,也是為人服務(wù)的,爭(zhēng)論這個(gè)是學(xué)院派和工程派之間的事情,我們實(shí)現(xiàn)好我們自己系統(tǒng)就可以了,何必過分在神仙打架。
// 你的評(píng)論其實(shí)挺好的。Sigh,只可惜因?yàn)镮E,我好可憐啊~~~
您可能感興趣的文章:
- 原生js實(shí)現(xiàn)回復(fù)評(píng)論功能
- JavaScript評(píng)論點(diǎn)贊功能的實(shí)現(xiàn)方法
- vue.js評(píng)論發(fā)布信息可插入QQ表情功能
- Vue.js實(shí)現(xiàn)文章評(píng)論和回復(fù)評(píng)論功能
- vue.js實(shí)現(xiàn)用戶評(píng)論、登錄、注冊(cè)、及修改信息功能
- 使用AngularJS和PHP的Laravel實(shí)現(xiàn)單頁(yè)評(píng)論的方法
- JavaScript實(shí)現(xiàn)簡(jiǎn)單評(píng)論功能
- js寫的評(píng)論分頁(yè)(還不錯(cuò))
- react結(jié)合bootstrap實(shí)現(xiàn)評(píng)論功能
相關(guān)文章
JavaScript為對(duì)象原型prototype添加屬性的兩種方式
為對(duì)象原型prototype添加屬性的的方法, 需要的朋友可以參考下。2010-08-08javascript 面向?qū)ο缶幊袒A(chǔ) 多態(tài)
javascript 面向?qū)ο缶幊袒A(chǔ) 多態(tài) 的實(shí)現(xiàn)方法說明,大家可以看下下面的代碼。2009-08-08JavaScript 工具庫(kù) Cloudgamer JavaScript Library v0.1 發(fā)布
研究了一年多的js,也差不多寫一個(gè)自己的js庫(kù)了。 我寫這個(gè)不算框架,只是一個(gè)小型的js工具庫(kù),所以我用的名字是Library。2009-10-10

javascript中的對(duì)象創(chuàng)建 實(shí)例附注釋
為了讓你的js代碼更加的專業(yè)與代碼的條理性,很多情況下都是定義成對(duì)象的方式來書寫代碼,想深入的朋友可以參考下。
2011-02-02 
javascript new一個(gè)對(duì)象的實(shí)質(zhì)
javascript 中,new一個(gè)對(duì)象的實(shí)質(zhì)是什么?即,當(dāng)我們構(gòu)建一個(gè)類的實(shí)例的時(shí)候,真正做了些什么?
2010-01-01