`
java_frog
  • 浏览: 253126 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

prototype的含义

阅读更多
我们知道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属性怎么使用后,下面我们再来深入的研究它。 上面的文章中我罗列了一下prototype属性在JScript中的各种用法,但是prototype这个东西却不是JScript创造出来的,JScript实际上是使用了我们设计模式中prototype pattern的一种衍生形式。下面我先简单的说一下prototype pattern,然后再来看到底JScript中的prototype是怎么回事?! What's prototype pattern? Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype. 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。 继续了解到底什么是prototype pattern,可以参看'设计模式之Prototype(原型)'这篇文章,即使不懂Java也没有关系,把它的代码都当C#看就行了。 搞清楚什么是原型了吧?反正记着一点,prototype pattern是的实现是依赖于clone这个操作的,当然要shallow copy还是deep copy的clone看自己的需要了。 下面我们继续说JScript里的prototype,为什么我们说它和prototype pattern里的prototype不一样呢?! 这个不是我说就说出来的,也不是我吹出来的,看看这个示例,你就能大概糊涂: 程序代码 <script language="javascript"> function RP() { RP.PropertyA = 1; RP.MethodA = function() { alert("RP.MethodA "); }; this.PropertyA = 100; this.MethodA = function() { alert("this.MethodA"); }; } RP.prototype.PropertyA = 10; RP.prototype.MethodA = function() { alert("RP.prototype.MethodA"); }; </script> 不要着急,还没有开始做示例,只是给出了我们用来演示的一个类。RP是什么?rpwt吗?当然不是了,RP是ResearchPrototype了。好了不废话了,看示例及结果分析。 程序代码 <script language="javascript"> rp = new RP(); alert(RP.PropertyA); RP.MethodA(); alert(rp.PropertyA); rp.MethodA(); </script> 运行结果闪亮登场: 1 RP.MethodA 100 this.MethodA 这个%$@#^$%&^...,不要着急,继续看哦! 程序代码 <script language="javascript"> rp = new RP(); delete RP.PropertyA; alert(RP.PropertyA); delete RP.MethodA; RP.MethodA(); delete rp.PropertyA; alert(rp.PropertyA); delete rp.MethodA; rp.MethodA(); </script> 运行结果再次登场: 程序代码 undefined A Runtime Error has occurred. Do you wish to Debug? Line: 32 Error: Object doesn't support this property or method 10 RP.prototype.MethodA 好玩吧,看出来什么名堂了吗?这里的RP.PropertyA和RP.MethodA只是用来做参照的,可是怎么把this.PropertyA和this.MethodA都delete了,还能出来结果,而且还是prototype导入的属性和方法呢? 这就是JScript的prototype和prototype pattern中prototype最大的不同了,JScript中的这个所谓的prototype属性其实是个语言本身支持的特性,这里没有发生任何的copy,不管shallow还是deep的。对于JScript的解释引擎,它在处理"."或"[keyName]"引用的对象的属性和方法时,先在对象本身的实例(this)中查找,如果找到就返回或执行。如果没有查找到,就查找对象的prototype(this.constructor.prototype)里是否定义了被查找的对象和方法,如果找到就返回或执行,如果没有查找到,就返回undefined(对于属性)或runtime error(对于方法)。 正因为prototype导入类实例的属性或方法是动态查找的,所以我们才能对系统内部对象添加prototype属性和方法,比如给String对象添加trim方法: 程序代码 <script lanuage="javascript"> String.prototype.trim() { return this.replace(/(^\s+)|(\s+$)/g, ""); } </scritp> 显然JScript中的这种用法也是prototype pattern中的prototype不能解释和支持的。 这下对于JScript OOP中原型继承法的理解因该没有任何的障碍了吧?同时也应该明白为什么原型继承法有那么大的天生缺陷了吧?当然如果有任何问题,欢迎继续讨论。 附演示示例源代码: 程序代码 <html> <head> <meta name="author" content="birdshome@博客园"> <title>JScript Prototype Research</title> </head> <body> <script language="javascript"> function RP() { RP.PropertyA = 1; RP.MethodA = function() { alert("RP.MethodA "); }; this.PropertyA = 100; this.MethodA = function() { alert("this.MethodA"); }; } RP.prototype.PropertyA = 10; RP.prototype.MethodA = function() { alert("RP.prototype.MethodA"); }; </script> <script language="javascript"> rp = new RP(); delete RP.PropertyA; alert(RP.PropertyA); delete RP.MethodA; RP.MethodA(); delete rp.PropertyA; alert(rp.PropertyA); delete rp.MethodA; rp.MethodA(); </script> </body> </html> JavaScript中什么是prototype原型对象?它有和作用?http://zhidao.baidu.com/question/37219013.html?si=2在JavaScript中,prototype对象是实现面向对象的一个重要机制。每个函数就是一个对象(Function),函数对象都有一个子对象prototype对象,类是以函数的形式来定义的。prototype表示该函数的原型,也表示一个类的成员的集合。在通过new创建一个类的实例对象的时候,prototype对象的成员都成为实例化对象的成员。 1、该对象被类所引用,只有函数对象才可引用; 2、在new实例化后,其成员被实例化,实例对象方可调用。 同时,函数是一个对象,函数对象若直接声明成员,不用被实例化即可调用。
分享到:
评论

相关推荐

    prototype学习笔记

    首先,理解`prototype`的基本含义是关键。在JavaScript中,每个函数都有一个`prototype`属性,这个属性是一个对象,当创建一个新的对象实例时,该实例会继承`prototype`对象的属性和方法。因此,`prototype`是实现...

    JavaScript中prototype的使用

    本文将深入探讨`prototype`的含义、作用以及如何使用。 1. **什么是prototype** 在JavaScript中,每个函数都有一个`prototype`属性,这个属性实际上是一个对象,它定义了该函数作为构造函数时,新创建的对象将继承...

    serena prototype composer 2008实例教程

    这些元素是构建业务流程模型的基础,理解它们的含义和用法至关重要。 3. **连接线和流向**:流程中的元素之间通过连接线表示逻辑关系,设置流向可以明确任务执行顺序。学习如何正确绘制和调整连接线,以及设置条件...

    关于JS中prototype的理解

    3. **`prototype`的含义**: 每个JavaScript对象都有一个`__proto__`属性,指向其构造函数的`prototype`对象。当试图访问一个对象实例上的属性或方法时,如果该对象自身没有这个属性,JavaScript会沿着`__proto__`...

    找到了一篇jQuery与Prototype并存的冲突的解决方法

    然而, `$` 变量在这两个框架中有不同的含义。 jQuery使用 `$` 变量来表示 jQuery 对象,而 Prototype 使用 `$` 变量来表示Prototype对象。这样,在同一个页面中使用这两个框架时,就会出现变量名冲突的问题。 那么...

    谈谈js中的prototype及prototype属性解释和常用方法

    本文将深入探讨`prototype`的含义、作用以及如何使用。 首先,`prototype`是JavaScript中每个函数(对象构造器)的一个属性,它实际上是一个对象,用于实现对象间的继承。当创建一个新的实例时,这个实例会自动获得...

    Litebox 无刷新图片放大显示插件(Prototype).zip

    至于"132674357088417250"文件,它的命名没有明确的含义,但根据上下文推测,它可能是Litebox插件的示例代码、配置文件,或者是包含具体实现细节的文档。要理解这个文件的内容,需要打开并查看其实际内容。 总的来...

    prototype框架中美元符号$用法分析

    Prototype中的美元符号`$`是一个非常常用的快捷方法,它在不同的上下文中有不同的含义。下面我们将详细探讨Prototype框架中`$`、`$$`、`$A`、`$F`、`$H`以及`$R`这些函数的用法。 1. **`$()`**:在Prototype中,`$...

    简单理解js的prototype属性及使用

    再来深入探讨prototype的含义。当定义一个函数时,JavaScript会自动为该函数创建一个prototype对象,这个对象的constructor属性指向原函数本身。函数的prototype属性实际上是一个对象,这个对象的用途是通过new操作...

    Js里面给String添加trim()方法,实现去掉字符串两边空格

    正则表达式的具体含义如下: - `(s*)`:匹配任意数量的空白字符(包括空格、制表符、换行符等)。`s` 在正则表达式中代表任何空白字符。 - `^` 和 `$` 分别表示字符串的开始和结束位置,确保只在开头和结尾处的空白...

    Javascript中的Prototype到底是什么

    首先,让我们明确Prototype的含义。每个函数(在JavaScript中,函数也是对象)都有一个名为`prototype`的属性,这个属性实际上是指向另一个对象,我们称之为`prototype对象`。`prototype对象`包含了一个`constructor...

    深入了解javascript中的prototype与继承

    然而,这种方法并不完美,因为它使得`prototype`同时承载了两层含义:一是表示父类,二是作为实例的原型。为了更好地处理这种情况,我们可以使用`Object.getPrototypeOf`方法来获取对象的原型,而用`Object.create`...

    Prototype Selector对象学习

    它定义了特定的字符串所代表的含义,如字符串代表的是选择元素的first-child,而另一个字符串代表的是查询nth-child。这些标准的建立使得我们能够通过编写简洁的查询语句来选取DOM树中的特定元素。 Prototype ...

    关于Javascript 对象(object)的prototype

    总结来说,JavaScript中的prototype属性有其特定的应用和含义: - 在函数对象上,prototype属性用于定义构造函数创建的所有实例共享的属性和方法。 - 在普通对象上,没有prototype属性,但是可以通过__proto__属性...

    Prototype RegExp对象 学习

    在JavaScript中,有些字符如`.`、`*`、`+`等在正则表达式中有特殊的含义,如果要在字符串中使用它们作为普通字符,就需要进行转义。`RegExp.escape`函数通过`replace`方法和正则表达式 `/([.*+?^=!:${}()|[\]\/\\])/...

    meteor-prototype-regexp

    "meteor-prototype-regexp"项目旨在解决这个问题,通过扩展`RegExp`原型,增加了一个名为`escape`的方法。 `RegExp.escape(str)`方法的目的是接收一个字符串参数`str`,然后返回一个新的字符串,其中所有正则表达式...

    cygnus-hifi-prototype

    "DSI"可能是开发者的个人标识或项目的特定缩写,但没有更多信息来确定其确切含义。描述中提到“使用cactus静态生成”,这表明该项目使用了Cactus,一个用于构建静态网站的开源工具。Cactus允许开发者用Markdown或...

    Express_Prototype

    首先,我们来深入理解一下"Java"这一标签的含义。Java是一种广泛使用的面向对象的编程语言,尤其在移动应用开发领域,Java以其跨平台的特性、强大的库支持以及易于学习的语法,成为了Android应用开发的首选语言。...

    js老生常谈之this,constructor ,prototype全面解析

    javascript中的this,constructor ,prototype,都是老生常谈的问题,深入理解他们的含义至关重要。在这里,我们再来复习一下吧,温故而知新! this this表示当前对象,如果在全局作用范围内使用this,则指代当前页面...

Global site tag (gtag.js) - Google Analytics