鸟食轩

 Microsoft .NET[C#] MVP 2003
随笔 - 429, 文章 - 235, 评论 - 5527, 引用 - 356
数据加载中……

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 阅读(14781) 评论(18)  编辑 收藏 网摘 所属分类: Jscript&Dhtml开发

评论

#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" target="_new">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[未注册用户]



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 105403




相关文章:

相关链接: