`
阅读更多

转两篇讲javascript prototype的文章

http://firefly-zp.iteye.com/blog/1249816

Javascript 中的原型函数(prototype)的工作原理,在 javascript 中每次声明新函数的过程中,就会为其创建一个 prototype 的属性。在未加其他附带条件情况下,所有的 prototype 属性都会自动获取 constractor 属性,constructor 内包含一个指向 prototype 属性所属函数的指针(就是说 constructor 回指构造函数本身)。 

举个例子来说,Fruit.prototype.constructor 指向 Fruit。并且可以通过这个构造函数,为其添加更多的属性和方法。 

当调用构造函数创建一个新实例后,该实例内部包含一个指针指向构造函数的原型函数。此时我们不用去关心内部的这个指针到底是什么(这个指针还的确有个名字:__proto__ 估计是为了对应 prototype 而起的名字吧 ~\(≧▽≦)/~ ),只需记住它的指向即可(指向构造函数的原型函数)。需要注意的是,这个 __proto__ 只存在于函数实例与构造函数的原型函数之间,而非实例与构造函数之间。 

下面画个图,来精心诠释一下。 



如上图所示,Fruit_1, Fruit_2 与构造函数没有直接的联系,只是这两个实例的 __proto__ 属性指向了 Fruit.prototype。虽然这两个实例都不包含属性和方法,但却可以通过 fruit_1.showPrice() 来调用。其理论依据是通过查找对象属性的过程来实现的。 

举个例子来说: 

Javascript代码  收藏代码
  1. function Fruit(){  
  2. }  
  3.   
  4. Fruit.prototype.category = "apple";  
  5. Fruit.prototype.price = 19.9;  
  6. Fruit.prototype.showPrice = function(){  
  7.     alert(this.price);   
  8. }  
  9.   
  10. var fruit_1 = new Fruit();  
  11. var fruit_2 = new Fruit();  
  12. alert(fruit_1.constructor == fruit_2.constructor);  // 输出 true  
  13. fruit_1.showPrice(); // 19.9  


此时,Fruit()构造函数变成了一个空函数,但却可以通过调用 prototype 往构造函数内直接增加属性和方法。并且在此时,仍然可以调用构造函数来 new 新对象,并且新对象具有通过原型函数向构造函数直接增加的属性和方法(有点拗口啊,就是说,通过原型函数直接向构造函数增加属性和方法,增加的这些属性和方法,在通过构造函数 new 出来新实例中也具有)。 

并且通过上面的例子可以看出,通过构造函数 new 出来的不同对象,具有与构造函数相同的属性和方法。并且这些都是共有的。 

这一切的一切表明,在构造函数外部可以通过原型函数为其增加属性和方法,并且与在构造函数内部声明具有相同的效果。 

 

第二篇()

-----------------------------------------------------------------

function User(name){
   this.name=name;
}
User.prototype.display = function(){
   alert("User's name is:"+this.name);
}
var me = new User("test");
me.display();

JavaScript能够实现的面向对象的特征有: 
·公有属性(public field) 
·公有方法(public Method) 
·私有属性(private field) 
·私有方法(private field) 
·方法重载(method overload) 
·构造函数(constructor) 
·事件(event) 
·单一继承(single inherit) 
·子类重写父类的属性或方法(override) 
·静态属性或方法(static member)


例子一(JavaScript中允许添加行为的类型): 可以在类型上使用proptotype来为类型添加行为。这些行为只能在类型的实例上体现。 JS中允许的类型有Array, Boolean, Date, Enumerator, Error, Function, Number, Object, RegExp, String

Js代码
  1. <script type= "text/javascript" >   
  2. Object.prototype.Property = 1;   
  3. Object.prototype.Method =  function  ()   
  4. {   
  5.     alert(1);   
  6. }   
  7.     
  8. var  obj =  new  Object();   
  9. alert(obj.Property);   
  10. obj.Method();   
  11. </script>   
  12.           
Js代码  收藏代码
  1. <span style="font-size: 18px;"><script type="text/javascript">  
  2. Object.prototype.Property = 1;  
  3. Object.prototype.Method = function ()  
  4. {  
  5.     alert(1);  
  6. }  
  7.    
  8. var obj = new Object();  
  9. alert(obj.Property);  
  10. obj.Method();  
  11. </script></span>  

  例子二(prototype使用的限制): 在实例上不能使用prototype,否则发生编译错误

Js代码
  1. <script type= "text/javascript" >   
  2. var  obj =  new  Object();   
  3. obj.prototype.Property = 1;  //Error   
  4. //Error   
  5. obj.prototype.Method =  function ()   
  6. {   
  7.     alert(1);   
  8. }   
  9. </script>   
  10.           
Js代码  收藏代码
  1. <span style="font-size: 18px;"><script type="text/javascript">  
  2. var obj = new Object();  
  3. obj.prototype.Property = 1; //Error  
  4. //Error  
  5. obj.prototype.Method = function()  
  6. {  
  7.     alert(1);  
  8. }  
  9. </script></span>  

  例子三(如何定义类型上的静态成员): 可以为类型定义“静态”的属性和方法,直接在类型上调用即可

Js代码
  1. <script type= "text/javascript" >   
  2. Object.Property = 1;   
  3. Object.Method =  function ()   
  4. {   
  5.     alert(1);   
  6. }   
  7.     
  8. alert(Object.Property);   
  9. Object.Method();   
  10. </script>   
  11.           
Js代码  收藏代码
  1. <span style="font-size: 18px;"><script type="text/javascript">  
  2. Object.Property = 1;  
  3. Object.Method = function()  
  4. {  
  5.     alert(1);  
  6. }  
  7.    
  8. alert(Object.Property);  
  9. Object.Method();  
  10. </script></span>  

  例子五(): 这个例子演示了通常的在JavaScript中定义一个类型的方法

Js代码
  1. <script type= "text/javascript" >   
  2. function  Aclass()   
  3. {   
  4. this .Property = 1;   
  5. this .Method =  function ()   
  6. {   
  7.     alert(1);   
  8. }   
  9. }   
  10. var  obj =  new  Aclass();   
  11. alert(obj.Property);   
  12. obj.Method();   
  13. </script>  
Js代码  收藏代码
  1. <span style="font-size: 18px;"><script type="text/javascript">  
  2. function Aclass()  
  3. {  
  4. this.Property = 1;  
  5. this.Method = function()  
  6. {  
  7.     alert(1);  
  8. }  
  9. }  
  10. var obj = new Aclass();  
  11. alert(obj.Property);  
  12. obj.Method();  
  13. </script></span>  

  例子六(JavaScript中允许添加行为的类型): 可以在外部使用prototype为自定义的类型添加属性和方法。

Js代码
  1. <script type= "text/javascript" >   
  2. function  Aclass()   
  3. {   
  4. this .Property = 1;   
  5. this .Method =  function ()   
  6. {   
  7.     alert(1);   
  8. }   
  9. }   
  10. Aclass.prototype.Property2 = 2;   
  11. Aclass.prototype.Method2 =  function   
  12. {   
  13.     alert(2);   
  14. }   
  15. var  obj =  new  Aclass();   
  16. alert(obj.Property2);   
  17. obj.Method2();   
  18. </script>   
  19.       
Js代码  收藏代码
  1. <span style="font-size: 18px;"><script type="text/javascript">  
  2. function Aclass()  
  3. {  
  4. this.Property = 1;  
  5. this.Method = function()  
  6. {  
  7.     alert(1);  
  8. }  
  9. }  
  10. Aclass.prototype.Property2 = 2;  
  11. Aclass.prototype.Method2 = function  
  12. {  
  13.     alert(2);  
  14. }  
  15. var obj = new Aclass();  
  16. alert(obj.Property2);  
  17. obj.Method2();  
  18. </script></span>  

  例子八(): 可以在对象上改变属性。(这个是肯定的)也可以在对象上改变方法。(和普遍的面向对象的概念不同)

Js代码
  1. <script type= "text/javascript" >   
  2. function  Aclass()   
  3. {   
  4. this .Property = 1;   
  5. this .Method =  function ()   
  6. {   
  7.     alert(1);   
  8. }   
  9. }   
  10. var  obj =  new  Aclass();   
  11. obj.Property = 2;   
  12. obj.Method =  function ()   
  13. {   
  14.     alert(2);   
  15. }   
  16. alert(obj.Property);   
  17. obj.Method();   
  18. </script>  
Js代码  收藏代码
  1. <span style="font-size: 18px;"><script type="text/javascript">  
  2. function Aclass()  
  3. {  
  4. this.Property = 1;  
  5. this.Method = function()  
  6. {  
  7.     alert(1);  
  8. }  
  9. }  
  10. var obj = new Aclass();  
  11. obj.Property = 2;  
  12. obj.Method = function()  
  13. {  
  14.     alert(2);  
  15. }  
  16. alert(obj.Property);  
  17. obj.Method();  
  18. </script></span>  

  例子九(): 可以在对象上增加属性或方法

Js代码
  1. <script type= "text/javascript" >   
  2. function  Aclass()   
  3. {   
  4. this .Property = 1;   
  5. this .Method =  function ()   
  6. {   
  7.     alert(1);   
  8. }   
  9. }   
  10. var  obj =  new  Aclass();   
  11. obj.Property = 2;   
  12. obj.Method =  function ()   
  13. {   
  14.     alert(2);   
  15. }   
  16. alert(obj.Property);   
  17. obj.Method();   
  18. </script>   
  19.           
Js代码  收藏代码
  1. <span style="font-size: 18px;"><script type="text/javascript">  
  2. function Aclass()  
  3. {  
  4. this.Property = 1;  
  5. this.Method = function()  
  6. {  
  7.     alert(1);  
  8. }  
  9. }  
  10. var obj = new Aclass();  
  11. obj.Property = 2;  
  12. obj.Method = function()  
  13. {  
  14.     alert(2);  
  15. }  
  16. alert(obj.Property);  
  17. obj.Method();  
  18. </script></span>  

  例子十(如何让一个类型继承于另一个类型): 这个例子说明了一个类型如何从另一个类型继承。

Js代码
  1. <script type= "text/javascript" >   
  2. function  AClass()   
  3. {   
  4.         this .Property = 1;   
  5.         this .Method =  function ()   
  6.        {   
  7.               alert(1);   
  8.        }   
  9. }   
  10.     
  11. function  AClass2()   
  12. {   
  13.         this .Property2 = 2;   
  14.         this .Method2 =  function ()   
  15.        {   
  16.               alert(2);   
  17.        }   
  18. }   
  19. AClass2.prototype =  new  AClass();   
  20.     
  21. var  obj =  new  AClass2();   
  22. alert(obj.Property);   
  23. obj.Method();   
  24. alert(obj.Property2);   
  25. obj.Method2();   
  26. </script>   
  27.           
Js代码  收藏代码
  1. <span style="font-size: 18px;"><script type="text/javascript">  
  2. function AClass()  
  3. {  
  4.        this.Property = 1;  
  5.        this.Method = function()  
  6.        {  
  7.               alert(1);  
  8.        }  
  9. }  
  10.    
  11. function AClass2()  
  12. {  
  13.        this.Property2 = 2;  
  14.        this.Method2 = function()  
  15.        {  
  16.               alert(2);  
  17.        }  
  18. }  
  19. AClass2.prototype = new AClass();  
  20.    
  21. var obj = new AClass2();  
  22. alert(obj.Property);  
  23. obj.Method();  
  24. alert(obj.Property2);  
  25. obj.Method2();  
  26. </script></span>  

  例子十一(如何在子类中重新定义父类的成员): 这个例子说明了子类如何重写父类的属性或方法。

Js代码
  1. <script type= "text/javascript" >   
  2. function  AClass()   
  3. {   
  4.         this .Property = 1;   
  5.         this .Method =  function ()   
  6.        {   
  7.               alert(1);   
  8.        }   
  9. }   
  10.     
  11. function  AClass2()   
  12. {   
  13.         this .Property2 = 2;   
  14.         this .Method2 =  function ()   
  15.        {   
  16.               alert(2);   
  17.        }   
  18. }   
  19. AClass2.prototype =  new  AClass();   
  20. AClass2.prototype.Property = 3;   
  21. AClass2.prototype.Method =  function ()   
  22. {   
  23.        alert(4);   
  24. }   
  25. var  obj =  new  AClass2();   
  26. alert(obj.Property);   
  27. obj.Method();   
  28. </script>
分享到:
评论

相关推荐

    js遍历属性 以及 js prototype 和继承

    在JavaScript中,遍历属性、理解`prototype`和掌握继承机制是编程中不可或缺的基本技能。本文将深入探讨这些概念,并通过实例来加深理解。 首先,让我们来看如何遍历JavaScript对象的属性。JavaScript提供了多种...

    javascript prototype文档.rar

    JavaScript中的原型(Prototype)是理解JavaScript继承机制的关键概念。它是一种对象属性,允许一个对象访问并继承另一个对象的属性和方法。在这个“javascript prototype文档”中,我们可以期待深入学习JavaScript...

    javascript prototype原型操作笔记.docx

    ### JavaScript Prototype原型操作知识点 #### 一、Prototype基础概念 **Prototype** 在 JavaScript 中是一个非常重要的概念,它支持面向对象编程中的继承特性。每个 JavaScript 对象都有一个内部属性 `[...

    prototype.js javaScript插件

    "Prototype.js"是一个针对JavaScript的开源库,旨在增强和扩展JavaScript的基本功能,尤其在处理DOM(文档对象模型)操作、事件处理以及Ajax交互时提供了极大的便利。 ### 1. Prototype.js核心概念 - **原型链**:...

    javascript Prototype 对象扩展.docx

    ### JavaScript Prototype 对象扩展 #### 一、简介与背景 在JavaScript中,`prototype`是一个非常重要的概念,尤其是在面向对象编程(OOP)方面。通过利用`prototype`,开发者能够更高效地管理对象间的共享属性和...

    js 框架 prototype 的帮助文档

    `js prototype框架`的核心特性包括: 1. **对象创建与继承**:Prototype 使用`Object.extend()`方法实现对象的创建和合并,使用`Class.create()`或`Object.subclass()`创建类并实现继承。另外,`Object.clone()`...

    JavaScript的prototype

    JavaScript中的`prototype`是一个核心概念,它涉及到对象继承和函数原型。在JavaScript中,每创建一个函数,该函数就会自动获得一个名为`prototype`的属性,这个属性是一个对象,用于实现对象间的继承。同时,每个...

    javascript类库prototype.js

    Prototype.js 是一个强大的JavaScript类库,它为开发者提供了丰富的功能,使得创建具有高度互动性和Web2.0特性的富客户端页面变得更为简单。这个库的设计理念是扩展JavaScript的基础对象,提供一套统一且易于使用的...

    JavaScriptprototype的深度探索不是原型继承那么简单.pdf

    JavaScriptprototype的深度探索不是原型继承那么简单.pdf

    FramerWebView, Framer.JS Prototype的网页查看器.zip

    FramerWebView, Framer.JS Prototype的网页查看器 FramerWebView用于 Framer.JS Prototype的简单网页查看器。 用你的Prototype的URL替换 iframe ,然后在你的浏览器中打开它,你可以很好地访问 ! FramerWebView假定...

    prototype_1.7.3.js 最新版本

    《prototype_1.7.3.js:JavaScript框架的里程碑》 在JavaScript的世界里,Prototype库是一个不可或缺的重要组成部分,尤其在Web开发领域,它为开发者提供了强大的功能和便利性。Prototype_1.7.3.js是这个库的一个...

    prototype的JS文件prototype的JS文件

    prototype的JS文件prototype的JS文件prototype的JS文件prototype的JS文件

    framer-templates, Framer.js Prototype的演示模板.zip

    framer-templates, Framer.js Prototype的演示模板 成帧器演示文稿模板 特性当在桌面浏览器上查看时,Prototype将出现在设备"图文框"中,后面有一个可选的背景。 Prototype的内容将按浏览器窗口的大小缩放为 MATCH ...

    js prototype截取字符串函数

    prototype它是用Javascript写好的一些API,包括对Javascript中的类如String,Array等进行的扩充,把JS文件嵌入后直接用就行了. 代码如下:String.prototype.strLen = function() { var len = 0; for (var i = 0; i ...

    prototype.js的系列文章

    prototype.js的系列文章——$H()函数 百度的Ajax.js文件 常用JS prototype.js的系列文章——$R()函数 prototype.js的系列文章——Ajax.Request类 prototype.js的系列文章——Ajax.Updater类 prototype.js的系列文章...

    JavaScript_Prototype(源代码+中文手册).rar

    JavaScript Prototype 是一种重要的编程概念,尤其在Web开发中不可或缺。这个压缩包文件“JavaScript_Prototype(源代码+中文手册).rar”包含了关于JavaScript原型的源代码和中文手册,为学习和理解这一主题提供了...

    Prototype

    Prototype 是一个广泛使用的JavaScript库,设计目的是为了简化JavaScript的开发,尤其是处理DOM操作、AJAX交互以及事件处理等方面的工作。它通过提供一系列实用的工具函数和面向对象的特性,极大地提高了JavaScript...

    javascript prototype原型详解(比较基础)

    JavaScript中的`prototype`原型是理解面向对象编程的关键概念之一,尤其在JavaScript中,它是一种实现对象继承的方式。本文将深入探讨`prototype`的基本概念、作用以及通过代码实例来阐述其工作原理。 首先,每个...

    prototypejs 1.7.3

    PrototypeJS,简称为Prototype,是一个广泛用于JavaScript编程的开源库,它为JavaScript语言引入了许多实用的类和方法,极大地提高了开发效率。版本1.7.3是这个库的一个稳定版本,其中包含了丰富的功能和优化。...

    Prototype API

    "prototype.js 1.4.0 开发笔记中文版"很可能提供了针对该版本的详细解读和开发实践,对于学习和理解Prototype API 的具体用法和最佳实践非常有帮助。 综上所述,Prototype API 和 Scriptaculous 提供了丰富的...

Global site tag (gtag.js) - Google Analytics