[求助] javascript定义类的函数加prototype是什么意思?

Matumoto 2009-03-05 10:05:29
是否是允许该类的实例化对象能继承原型对象,如果不加prototype就不能继承原型对象中的函数?

/*定义一个Test类,有A、B两个属性*/
function Test(a,b)
{
this.A = a;
this.B = b;
}

/*定义一个函数sum,分别给属性A、B加上a、b的值*/
Test.sum(a,b) = function()
{
return new Test(this.A + a, this.B + b);
}

Test.prototype.update(a,b) = function()
{
return new Test(a,b);
}

var test = new Test(1,2);
test.sum(1,2);//test.A == 2,test.B == 4
test.update(1,2);//update对象不支持此属性或方法,意思就是不加prototype属性,实例化对象test就无法调用函数update??


...全文
3032 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
s45016898810 2012-01-12
  • 打赏
  • 举报
回复
先谢2楼
昭义九州 2010-05-29
  • 打赏
  • 举报
回复
好东西标记一下
moliu 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 leiru 的回复:]
Test.prototype.update = function(a,b)
{
  return new Test(a,b);
}
这样写就相当与Test的private方法..// 这是实例 方法
Test.sum= function(a,b)
{
  return new Test(this.A + a, this.B + b);
}//这是类方法这样写的话为什么就不能调用呢??
他不能成为公共方法嘛??
直接执行Test.sum也是ok的啊!

[/Quote]
bufan2162 2009-05-21
  • 打赏
  • 举报
回复
...
手写 2009-03-11
  • 打赏
  • 举报
回复
在强调一个问题,那就是Test.sum在新的事例化的对象上是没办法调用的
也就是var t=new Test(1,2);
t.num(2,1)这本身是错的

-----------------------
原因在于:
Test.sum和Test.prototype.sum的区别在于什么?
可以看一下16楼 .
Test.prototype.sum是Test的原型上附加sum方法
Test.sum是Test域附加sum方法
------------------------
首先,var Test=function(){....}等同function Test(){....}
他们都在他们所在的空间里声明了变量Test并将方法赋予他.
在这里有可能混淆的是认为Test就是function(){....},
所以理所应当的认为Test.sum =..等同于
function Test (){
this.sum=....//当然能被实例化调用

} 
事实完全不是这样.详细原因在11楼
Matumoto 2009-03-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zowell 的回复:]
引用 7 楼 leiru 的回复:
Test.prototype.update = function(a,b)
{
return new Test(a,b);
}
这样写就相当与Test的private方法..

Test.sum= function(a,b)
{
return new Test(this.A + a, this.B + b);
}
这样写的话为什么就不能调用呢??
他不能成为公共方法嘛??
直接执行Test.sum也是ok的啊!

对于Test.sum应该从理解javascript字面量上去理解.
function Test(){}//意思是声明一个名字为Test的方法.
等同于var Test=function(){}
Test代表了function(){}但却不是function(){}的本体.
也可以算是function(){}被实例出来的一个对象.
你可以测试一下for(var s in test)alert(s);也就是说Test.sum仅仅是对Test这个进行了扩展.而不是函数本身.
对于继承关系,新对象是继承的对象的本体而不是他的字面量.
[/Quote]
你这说的很杂乱,没看懂是啥意思。
笑的自然 2009-03-07
  • 打赏
  • 举报
回复
javascript其实不是严格意义的OO语言,至少他没有很好地实现封装和继承,甚至javascript使用的是function式对象。

因此,javascript有一个奇怪的东西就是prototype,javascript中约定了每个对象都可以包含一个prototype对象的引用(属性),
这个prototype对象在运行时是不可见的,也就是说,定义了之后,你无法直接使用prototype对象。

那么,prototype对象有什么用呢?它的作用,就是当你去调用一个对象的函数或属性时,javascript首先会在这个对象的定义中查找,如果找不到,
他就会去找这个对象的prototype对象有没有这个定义,如果还找不到,他又会去找prototype对象的prototype,一直到对象没有prototype定义为止。

是不是和函数继承的目的很象?这就是javascript的原型继承特性。
但是我们也看出了,这种查找方式,效率非常之低,尤其在prototype链很长的情况下。javascript 2.0会对此有所改进。

另外,prototype的定义方式也很奇怪,他必须以一个对象实例(而不是类)的形式,绑定到其他类上。记得吗?prototype是定义时的,同时又是对象。
Matumoto 2009-03-07
  • 打赏
  • 举报
回复
目前我所知道的,Test.sum可以像java或C#中的静态函数一样使用,也具有静态函数的特点,但我不知道其真正的意义所在。有高手知道吗?
licip 2009-03-07
  • 打赏
  • 举报
回复
原型,它的语法就是这样吧。
loulou_ff 2009-03-07
  • 打赏
  • 举报
回复
mark
手写 2009-03-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 Matumoto 的回复:]
目前我所知道的,Test.sum可以像java或C#中的静态函数一样使用,也具有静态函数的特点,但我不知道其真正的意义所在。
[/Quote]
吓~!扁嘴的可不一定就是鸭子.
静态方法应该在静态类中,并且不可操作非静态方法.他的用法是 类.方法
Test.sum=function(a,b) 
{return new Test(this.A + a, this.B + b); }

里面的this.A 和this.B , LZ是想测试他们不是在操作Test的实例么?
这里面的this其实就是Test.sum,是不?怎么会有呢?
静态方法.直接单体就解决了.



小范f-li.cn 2009-03-07
  • 打赏
  • 举报
回复
楼上说的已经很清楚了。

mark
手写 2009-03-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 leiru 的回复:]
Test.prototype.update = function(a,b)
{
return new Test(a,b);
}
这样写就相当与Test的private方法..

Test.sum= function(a,b)
{
return new Test(this.A + a, this.B + b);
}
这样写的话为什么就不能调用呢??
他不能成为公共方法嘛??
直接执行Test.sum也是ok的啊!
[/Quote]
对于Test.sum应该从理解javascript字面量上去理解.
function Test(){}//意思是声明一个名字为Test的方法.
等同于var Test=function(){}
Test代表了function(){}但却不是function(){}的本体.
也可以算是function(){}被实例出来的一个对象.
你可以测试一下for(var s in test)alert(s);也就是说Test.sum仅仅是对Test这个进行了扩展.而不是函数本身.
对于继承关系,新对象是继承的对象的本体而不是他的字面量.
Matumoto 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 leiru 的回复:]
Test.prototype.update = function(a,b)
{
return new Test(a,b);
}
这样写就相当与Test的private方法..

Test.sum= function(a,b)
{
return new Test(this.A + a, this.B + b);
}
这样写的话为什么就不能调用呢??
他不能成为公共方法嘛??
直接执行Test.sum也是ok的啊!
[/Quote]
Test.sum搞得像静态函数似的。
leiru 2009-03-06
  • 打赏
  • 举报
回复
那么
Test.sum= function(a,b)
{
return new Test(this.A + a, this.B + b);
}
这句话的意义在那里呢??
手写 2009-03-05
  • 打赏
  • 举报
回复
事实上,当一个对象被实例化的时候,新对象会将原对象的原型的方法作为构造的一部分.
也就是
var A=function(){this.value=0;};
A.prototype.get=function(){return this.value;}

如果var a=new A();
那实际上,a去找到了A的原型,将其中的方法做为构造a=function(){
....
.....
this["get"]=A.prototype["get"];
}

每一个对象都有他的原形,string number Function ...
但是只有Function 有prototype这个属性.
此属性指向其原型. 
(确切的说 a=c=b="123",并不代表a b c等于"123",
只是作为字面量的a b c都做为一个指针去指向"123"所在的内存空间)
大家可以用这么一种实例化的继承机制来实现继承.那就是上面说的,所有新对象都会去找原对象的原形,然后获取里面的方法.

Matumoto 2009-03-05
  • 打赏
  • 举报
回复
非常感谢楼上各位的回答,我现在有一个疑问,如果不加prototype,那定义的函数就无法被实例化的对象调用,那这样定义有什么意义呢?
lxy0502030314 2009-03-05
  • 打赏
  • 举报
回复
那个sum不能被调用,给对象原型添加函数就是要用prototype,直接用Test.sum添加会报错.
lxy0502030314 2009-03-05
  • 打赏
  • 举报
回复
你测试过你的代码吗?错误很多额.修改后
<script type="text/javascript">
function Test(a,b)
{
this.A = a;
this.B = b;
}
/*定义一个函数sum,分别给属性A、B加上a、b的值*/
Test.sum= function(a,b)
{
return new Test(this.A + a, this.B + b);
}

Test.prototype.update = function(a,b)
{
return new Test(a,b);
}
function hee(){
var test = new Test(1,2);
test.sum(1,2);//test.A == 2,test.B == 4
test.update(1,2);
}
</script>
luojihaidao 2009-03-05
  • 打赏
  • 举报
回复
楼上说的已经很清楚了。此外prototype可以用来继承。
加载更多回复(2)

87,914

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧