JScript中的prototype(原型)属性研究(1)

    我们知道JScript中对象的prototype属性,是用来返回对象类型原型的引用的。我们使用prototype属性提供对象的类的一组基本功能。并且对象的新实例会"继承"赋予该对象原型的操作。但是这个prototype到底是怎么实现和被管理的呢?

    对于对象的prototype属性的说明,JScript手册上如是说:所有 JScript 内部对象都有只读的 prototype 属性。可以向其原型中动态添加功能(属性和方法),但该对象不能被赋予不同的原型。然而,用户定义的对象可以被赋给新的原型。

    下面我们看三个经典的prototype属性的使用示例。

    1、为脚本环境内建对象添加方法:

 Array.prototype.max = function()
 {
     
var i, max = this[0];
     
for (i = 1; i < this.length; i++)
     {
       
if (max < this[i])
        max 
= this[i];
     }
    
return max;
 };

    2、为用户自定义类添加方法:
 function TestObject(name)
 {
     
this.m_Name = name;
 }

 TestObject.prototype.ShowName 
= function()
 {
     alert(
this.m_Name);
 };

    3、更新自定义类的prototype:
 function TestObjectA()
 {
    
this.MethodA = function()
    {
       alert('TestObjectA.MethodA()');
    }
 }

 
function TestObjectB()
 {
    
this.MethodB = function()
    {
       alert('TestObjectB.MethodB()');
    }
 }

 TestObjectB.prototype 
= new TestObjectA();

    第三个很眼熟吧?对啊,它就是我们前面介绍的原型继承法呀~~ 不过今天我们不是研究"继承",之所以可以这样来实现一种继承,只是利用了prototype属性的一个副作用而已。

    prototype还有一个默认的属性:constructor,是用来表示创建对象的函数的(即我们OOP里说的构造函数)。constructor属性是所有具有prototype属性的对象的成员。它们包括除Global和Math对象以外的所有JScript内部对象。constructor属性保存了对构造特定对象实例的函数的引用。

    弄清楚了JScript中prototype属性怎么使用后,下面我们再来深入的研究它。

posted on 2005-02-17 22:59 birdshome 阅读(22307) 评论(19) 编辑 收藏

评论

#1楼  回复 引用 查看   

晕,我正看着下面要怎么写呢。敲一下回车就提交了。
不好意思,请删除。
说说对第三种的看法:

个人认为这样写不是很方便。^_^

还不如:

function TestObjectA()
{
this.MethodA = function()
{
alert('TestObjectA.MethodA()');
}
this.MethodB = function()
{
alert('TestObjectB.MethodB()');
}
}

可能是我喜欢使用js的动态性的原因吧!
像第三种一定得加上TestObjectB.prototype = new TestObjectA();
这样很不方便。
我觉得还不如在某些不需要MethodA 的地方加上delete。这样就很像virtual了。
比如:
<script>
function A(){
this.a = function(){
alert("asdf");
}
this.b = function(){
alert("ttt");
}
}
var a = new A();
for(var item in a) a[item]();
delete a.a;
for(var item in a) a[item]();
</script>
这样可以想覆盖就覆盖,想删除就删除,想使用就使用。
2005-02-18 03:43 | 辣妹子      

#2楼[楼主]  回复 引用 查看   

这个主题专讲prototype,例三只是说明用户可以覆盖自定"类"的prototype而已。谢谢你的意见,不过好像更适合JS的OOP这样的讨论哦。
2005-02-18 10:13 | birdshome      

#3楼  回复 引用   

"3、更新自定义类的prototype:"
这个傻了吧? 不是也用了this.methodxx = xx了么?
写东西要统一
2005-03-13 13:07 | xx

#4楼  回复 引用   

@xx
这个和第2个一样吗?你理解的是什么?
2005-03-13 13:29 | birdshome

#5楼  回复 引用 查看   

好好利用prototype是我的目标。谢谢楼主的讲解,真是令人茅塞顿开!
2005-07-19 19:27 | 轩辕剑      

#6楼  回复 引用   

谢谢楼主的讲解 真透彻
2005-11-23 14:11 | 大飞[未注册用户]

#7楼  回复 引用 查看   

prototype源码里的,Object.Extend = ... ...
没通过prototype属性也可以扩展的吗?
2007-11-30 15:06 | 巫云      

#8楼[楼主]  回复 引用 查看   

@巫云
没有通过prorotype的扩展特性叫做expando,关于expando的更多内容可以参考:
http://www.cnblogs.com/birdshome/archive/2005/06/24/GetExpandoAttributes.html
2007-11-30 15:12 | birdshome      

#9楼  回复 引用   

好!
2008-10-21 21:39 | 邹勇[未注册用户]

#10楼  回复 引用   

正好看这个,谢谢楼主了,看过楼主的书(不记得是不是译著了),不错
2009-06-25 11:53 | xml_wang[未注册用户]

#11楼  回复 引用   

我还是不懂原型是什么东西
2009-12-27 07:27 | 嗷嗷嗷[未注册用户]

导航

公告

  原创技术文章和心得,转载必须注明来源"博客园"!
  贴子以"现状"提供,且没有任何担保,同时也没有授予任何权利。
昵称:birdshome
园龄:7年10个月
荣誉:推荐博客
粉丝:73
关注:3

搜索

 

常用链接

我的标签

随笔分类(337)

文章分类(147)

相册

Ex-Colleagues

常用链接

兄弟情深

积分与排名

  • 积分 - 3145044
  • 排名 - 6

最新评论

阅读排行榜

推荐排行榜