prototype

阅读 / 问答 / 标签

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>运行结果闪亮登场:1RP.MethodA100this.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>运行结果再次登场:程序代码undefinedA Runtime Error has occurred.Do you wish to Debug?Line: 32Error: Object doesn"t support this property or method10RP.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>

__proto__ 和 prototype 的区别

http://www.cnblogs.com/snandy/archive/2012/09/01/2664134.html看下理论分析方面的吧。就能明白了

__proto__和prototype是什么?

1.三点谨记: (1) 每个对象都具有一个名为 proto 的属性 指向他的构造函数的prototype. (2)每个构造函数都有个prototype的方法。(注意:既然是方法,那么就是一个对象(JS中函数同样是对象),所以prototype同样带有 proto 属性); (3).每个对象的 proto 属性指向自身构造函数的prototype; Object.getPrototypeOf(ColorPoint) === Point // true

C语言中的prototype是什么意思?

表示函数原型你那个主函数的prototype就是void main(void);

js prototype是什么

用来实现面向对象的继承

Js原型(prototype)01

1.原型是 function对象的一个属性,是构造函数构造出对象的公有祖先,而原型本身也是一个对象。 2.从原型的概念出发,我们可以用构造函数构造出的对象提取原型上的属性。 3.因为原型也是一个对象,所以原型本身对自己的属性有增删改查的权利。 4.对象如何知道自己的原型是谁,可以通过对象中的_ proto_ 属性查看,_ proto_ 属性存的就是对象的原型,他是作为对象与原型之间的连接。 5.构造函数构造的对象如何查看是谁构造出自己的,可以通过constructor属性 首先从原型的定义开始解释: 原型是function对象的一个属性,这句话如何理解? 1.function函数其实就是一个对象,当你构造出一个函数时,这个函数对象就有了自己隐式的属性,prototype就是其中的一个属性。 那么先构造出一个函数,在控制台查看,函数对象是否有prototype,并且prototype是否也是一个对象。 我们在控制台中给father的prototype属性添加name属性并赋值,看看是否有效? 给prototype添加属性后,并可以输出name的值。那么也是可以给prototype添加方法的。 给prototype添加say方法实现输出自己的name,执行say(),的确输出了"haha" 2.我们如何理解,prototype是构造函数构造出对象的公有祖先? 首先当构造出函数时prototype就成为了这个函数的属性,并且prototype也可以添加属性和方法,而构造函数构造出的对象能继承构造函数中的方法,且这个对象自身也能添加属性和方法? 那么问题来了? 当我查看对象的name属性时,对象并没有这个属性,那他就会自动去构造出自己的函数中去找是否有这个属性,那当构造函数也没这个属性时,他就会去自己的原型上查找是否有这个属性,如果原型上存在name属性,对象就会获取到这个属性并输出。 而这个获取到原型属性的过程,其实就是一种继承的方式。 举例: 1.prototype是function对象的一个属性; 2.prototype是构造函数构造出对象的公有祖先; 3.prototype也是一个对象。 从总结的第三点可以知道,prototype可以拥有自己的属性和方法,并有权进行增删改查,那么接下来展示prototype如何进行增删改查。 对Mom的prototype属性进行操作。 增: 给出你想要添加的属性,并赋值。 删: delete 所以prototype对象的增删改查和普通对象的用法相同。 这里还需注意,prototype上的属性只能由自身操作,对象从prototype上获取到的属性进行操作后,并不会影响到prototype。 接下来解释对象的_ proto_ 属性(前后分别是两个_) _ proto_ 属性里存的是对象的prototype 举例: 接下来解释constructor属性: 对象可以通过该属性查看构造出自己的函数 总结: prototype是function对象的一个属性,是构造函数构造出的对象的公有祖先,他本身也是一个对象,所以他可以有自己的属性和方法,并对其进行增删改查的操作,对象没有权利修改prototype上的属性和方法。对象可以通过自己的_ proto_ 查看他的prototype,通过constructor查看构造出自己的函数。

_proto_和prototype到底有啥区别

是时候拿出我珍藏多年的这张图了: 1.在JS里,万物皆对象。方法(Function)是对象,方法的原型(Function.prototype)是对象。因此,它们都会具有对象共有的特点。 即:对象具有属性 proto ,可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型,这也保证了实例能够访问在构造函数原型中定义的属性和方法。 2.方法(Function) 方法这个特殊的对象,除了和其他对象一样有上述 proto 属性之外,还有自己特有的属性——原型属性(prototype),这个属性是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法(我们把这个对象叫做原型对象)。原型对象也有一个属性,叫做constructor,这个属性包含了一个指针,指回原构造函数。 1.构造函数Foo() 构造函数的原型属性Foo.prototype指向了原型对象,在原型对象里有共有的方法,所有构造函数声明的实例(这里是f1,f2)都可以共享这个方法。 2.原型对象Foo.prototype Foo.prototype保存着实例共享的方法,有一个指针constructor指回构造函数。 3.实例 f1和f2是Foo这个对象的两个实例,这两个对象也有属性 proto ,指向构造函数的原型对象,这样子就可以像上面1所说的访问原型对象的所有方法啦。 构造函数Foo()除了是方法,也是对象啊,它也有 proto 属性,指向谁呢? 指向它的构造函数的原型对象呗。函数的构造函数不就是Function嘛,因此这里的 proto 指向了Function.prototype。 其实除了Foo(),Function(), Object()也是一样的道理。 原型对象也是对象啊,它的 proto 属性,又指向谁呢? 同理,指向它的构造函数的原型对象呗。这里是Object.prototype. 最后,Object.prototype的 proto 属性指向null。 1.对象有属性 proto ,指向该对象的构造函数的原型对象。 2.方法除了有属性 proto ,还有属性prototype,prototype指向该方法的原型对象。

js中的prototype有什么作用?

js的框架,已经更新到 prototype-1.6.0.3 了。封装了一些常用的方法!官网:http://www.prototypejs.org/

prototype什么意思

prototype 英[u02c8pru0259u028atu0259tau026ap] 美[u02c8prou028atu0259tau026ap] n. 原型; 雏形; 最初形态; [例句]Chris Retzler has built a prototype of a machine called the wave rotor.克里斯·雷茨勒已制造出了一种叫波转子的机器的样机。[其他] 复数:prototypes

prototype怎么读

英[?pr??t?ta?p] 美[?pro?t?ta?p]n. 原型; 雏形; 最初形态;[例句]He flew the prototype to West Raynham to demonstrate it to a group of senior officers他将原型空运到西雷纳姆,向一批高级军官作演示。[其他] 复数:prototypes

prototype是什么意思

prototype 英[ˈprəʊtətaɪp] 美[ˈproʊtətaɪp] n. 原型,雏形,蓝本; [例句]Three engineers began building a prototype.三位工程师着手编写原型。

javascript中 原型对象中的 例如:obj.prototype.constructor指向错误,不是指向构造函数本身,那有什么影响?

这个我估计跟java中实例与原型一样this指向当前对象但是MyObj类似java中static一样 是这个类的共有属性或则方法估计是this.prototype只能是属性 MyObj可以是属性或者function

js中函数的prototype.constructor是指向函数本身,它有什么用

是父级元素的描述我写段东西说明下var a = function(){}//指向你通过new创建实例所产生的对象源//function本身自己就是个对象,所以指向自己a.prototype.constructor//指向你当前Function对象的的父级元素a.prototype.__proto__var b = new ab.constructor === a;

怎么解决ie下不支持dom对象继承object的prototype自定义方法

Javascript作为一种语言,有个美誉,开发者可以重新定义任何事情。虽然这在过去的一些javascript可以,但是ECMAScript5中已经开始得到改变,例如,我们可以使用Object.defineProperty创建一个不能被修改的对象的属性。一、基本用法假如我想构建一个math.js库,看下面的实例:var mathObj = { constants: { "pi": 3.14 }, areaOfCircle: function(radius) { return this.constants.pi*radius*radius; }} 在上例中,如果有人改变pi的值,那么我们将不会得到正确的计算结果,虽然有很多方法可以解决此问题,但是最简单的方法是使用pi属性不可写。看下面实例:var mathObj = { constants: {}, areaOfCircle: function(radius) { return this.constants.pi*radius*radius; }} Object.defineProperty(mathObj.constants, "pi", { value: 3.14, writable: false});mathObj.constants.pi = "Benjamin";//Outputs: 3.14console.log(mathObj.constants.pi);Object.defineProperty(obj, prop, descriptor)方法接收三个参数:需要添加或修改属性的对象,属性名称,属性描述options。从上例可以看出,当给pi赋值为逗Benjamin地时,最后输出的值还是3.14。 但是如果给math.js使用逗use strict",将会报错,和给undefined赋值一样:"use strict";var mathObj = { constants: {}, areaOfCircle: function(radius) { return this.constants.pi*radius*radius; }} Object.defineProperty(mathObj.constants, "pi", { value: 3.14, writable: false});mathObj.constants.pi = "Benjamin";//<span style="color: #ff0000;">Outputs: Uncaught TypeError: Cannot assign to read only property "pi" of #<Object></span> console.log(mathObj.constants.pi);第三个参数的options中,writable默认值为false,所以在上例中可以省略,configurable默认值为false,如果你想使用你的库的用户故意重写pi的值,你可以设置configurable值为true。

求高达oo第2季ed prototype和泪のムコウ 歌词

prototype在百度下载后用千千静听播放

prototype和sample在外贸中的区别

prototype 是产品第一版 这是指产品的阶段 一般有 prototype-EVT-DVT-PVT-MPSamples, 指的是样品, 是产品, 两个概念不同
 首页 上一页  1 2