`

Javascript 中 prototype到底是什么?

 
阅读更多

prototype是Javascript原生对象的一个属性,比如Array有这个属性,String也有这个属性,

  

  console.log(Array.prototype);   //输出 [] 

  console.log(String.prototype);  //输出 String {} 

  

  另外一个比较特殊的Object如何呢?

  console.log(Object.prototype);  //输出 Object {}

  

  因为这个prototype跟Function对象联系最紧密(在涉及到javascript面向对象时),

  这里重点说下 Function这个原生对象.

  console.log(Function.prototype); //输出 function Empty() {} 

  

  这里的Function相当于一个类,我们在定义function是,就是在创建一个一个Function的实例.

  比如:

  

  function Animal()

  {

    this.species = "动物"; 

  }

  

  这个就相当于定义: 

  var Animal = new Function ('Animal','this.species = "动物";');

  

  在new()的时候,js主要干了下面几件事情:

  

  1. js运行环境首先创建一个空对象

  2. 把this变量指向这个对象

  3. 把__proto__指向这个构造器的prototype属性

  4. 通过this把属性和方法加在这个对象上

  5. 最后会把this指向的对象return出来(当然你也可以显示的return别的对象,这是情况跟我讨论的有点不一样)

  

  所以上面 console.log(Animal.__proto__);  //输出为 function Empty() {} ,这个其实是Function的prototype属性

  

  一旦一个构造函数(即,类(function))定义了prototype,则在new 调用构造函数,创建实例时,会自动创建一个__proto__属性,指向构造器的prototype属性

  

  并且,在访问实例属性时,假如在当前的实例属性中没有这个属性,js会自动沿着__proto__指向的prototype属性查找这个属性,

  

  如果__proto__指向的prototype属性中任不包含这个属性,则会查找__proto__指向的prototype属性的__proto__指向的下一层prototype属性,

  

  以此类推,知道找到这个属性,假如还没有找到,则返回undefined,因为最终prototype属性指向Object的prototype属性为空.

 

这里从__proto__对象中查找属性时,是根据属性名称查找的,比如aObject.prop,查这个prop属性,假如prop属性其实是在__proto__找到的,仍然使用aObject.prop调用,就好像prop是aObject的一个属性一样.

  

  这中链式查找prototype的方式构成了prototype链.

  

  console.log(Animal.__proto__);  //输出为 function Empty() {} ,这个其实是Function的prototype属性,因为定义的function Animal 其实是 Function的一个实例.

  

  这样Function就是一个类,而这个类是定义了prototype属性的.

  

  如果: var anAnimal = new Animal(); 

  console.log(anAnimal.__proto__);// 因为Animal类没有定义prototype属性,js会自动加一个默认属性.指向构造函数 Animal {} 

  //因为每一个实例都需要有一个constructor对象指向这个实例的构造函数(即类定义function),

  //而这个constructor对象是构造函数(即类定义function)的prototype的一个属性,所以js需要给没有定义prototype的构造函数

  //增加一个默认的prototype属性

  

  

  prototyp这个属性只有Function对象,以及创建的function才有的,就相当于一个静态属性.

  

  new 出来的一般实例一般没有这个属性,

  假如在构造函数中,定义了一个prototype属性,会怎样呢?

  如下:

  //定义一个基类

  function Animal()

  {

    this.species = "动物"; 

    this.prototype = '自定义prototype';

  }

  这里的prototype其实是实例的一个属性而已,只属于该实例.对该实例的构造函数的prototype属性不构成影响.

  实例的.__proto__这个属性,仍然指向构造函数的prototype属性.

//定义一个基类
  function Animal()
  {
    this.species = "动物"; 
    this.prototype = '自定义prototype';
  }
  
  Animal.prototype.show = function(){alert('This is an animal!');};
  console.log(Animal.prototype);
  var anAnimal = new Animal(); 
  console.log(anAnimal.prototype); //实例的一个普通属性而已,正常使用
  console.log(anAnimal.__proto__);//同 console.log(Animal.prototype);

 

假如定义一个function时没有显式指定prototype属性,和显式指定prototype属性,在chrome中显示的function对象是不一样的,如下:

a.不显式指定prototype

    

//定义一个基类
  function Animal()
  {
    this.species = "动物"; 
    this.prototype = '自定义prototype';
  }
  console.log(Animal.prototype);
  //输出 Animal {}

 

b. 显式指定prototype

   

//定义一个基类
  function Animal()
  {
    this.species = "动物"; 
    this.prototype = '自定义prototype';
  }
  
  Animal.prototype.show = function(){alert('This is an animal!');};
  console.log(Animal.prototype);

     上面的输出是一个对象的形式

      Animal {show: function}

 
  1. constructorfunction Animal()
  2. showfunction (){alert('This is an animal!');}
  3. __proto__Object

 

 

 参考: http://www.leonzhang.com/2011/12/20/javascript-prototype/

 

 

分享到:
评论

相关推荐

    javascript类库prototype.js

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

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

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

    JavaScript的prototype

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

    JavaScript中prototype的使用

    JavaScript中的`prototype`属性是实现面向对象编程的关键概念之一,尤其在JavaScript中,它用于实现对象的继承。本文将深入探讨`prototype`的含义、作用以及如何使用。 1. **什么是prototype** 在JavaScript中,每...

    Prototype_1.6 JavaScript代码和中文帮助手册

     在prototype.js中,prototype对象是实现面向对象的一个重要机制。  每个函数就是一个对象(Function),函数对象都有一个子对象 prototype对象,类是以函数的形式来定义的。prototype表示该函数的原型,也表示一...

    了解JavaScript中的prototype (实例)

    JavaScript中的`prototype`是理解面向对象编程的关键概念之一。它是一种机制,允许对象共享属性和方法,从而实现代码复用。在JavaScript中,每个函数(包括构造函数)都有一个内置的`prototype`属性,这个属性指向一...

    Professional JavaScript Frameworks: Prototype,YUI, ExtJS, Dojo and MooTools

    《Professional JavaScript Frameworks: Prototype,YUI, ExtJS, Dojo and MooTools》是关于JavaScript框架的高级编程资源,包含了各种知名框架的源代码,这些框架包括Prototype、YUI(Yahoo! User Interface Library...

    Advanced JavaScript (closures,prototype,inheritance)

    JavaScript,作为一种广泛应用于Web开发的脚本语言,其高级特性如闭包(closures)、原型(prototype)和继承(inheritance)是理解其精髓的关键。本文将深入探讨这些概念,帮助开发者更好地掌握JavaScript的核心。 ...

    jQuery、Mootools、Prototype三大JavaScript框架中文手册

    JavaScript是Web开发中不可或缺的一部分,它为网页添加了动态交互性。然而,原生JavaScript的API庞大且不统一,为了简化开发,社区创造了一系列的框架,其中jQuery、MooTools和Prototype是三个非常著名的JavaScript...

    javascript的prototype继承

    在JavaScript中,每个函数都有一个`prototype`属性,这个属性是一个对象,它的作用是当试图访问一个对象的属性时,如果该对象自身没有这个属性,就会去查找它的原型对象,以此类推,直到找到属性或者到达原型链的...

    JavaScript_prototype_pollution_attack_in_NodeJS.pdf

    2. **prototype**: 在JavaScript中,每个对象都有一个原型,它是一个包含了可以共享给其他对象的属性和方法的对象。原型机制是JavaScript的核心特性之一。 3. **pollution**: 在这里指代“污染”,即通过非法或恶意...

    Javascript中的Prototype到底是什么

    Javascript也是面向对象的语言,但它是一种基于原型Prototype的语言,而不是基于类的语言。接下来通过本文给大家介绍Javascript中的Prototype到底是啥的相关知识,感兴趣的朋友参考下

    prototype开发笔记.doc

    这部分详细列出了Prototype库中扩展的JavaScript类、对象和方法,涵盖对DOM、Event、Ajax等方面的增强。例如,`Element` 对象提供了大量操作DOM元素的方法,`Form` 和 `Form.Element` 对象则简化了表单元素的处理,...

    Javascript-prototype.js 1.4版开发者手册

    prototype.js是一个非常优雅的javascript基础类库,对javascript做了大量的扩展,而且很好的支持Ajax,国外有多个基于此类库实现的效果库,也做得很棒。 prototype.js不仅是一个有很大实用价值的js库,而且有很高...

    javascript框架(json.jQuery.prototype).rar

    在给定的标题“javascript框架(json.jQuery.prototype).rar”中,我们可以推测这是一个关于JavaScript框架,特别是jQuery框架的教程或者参考资料。jQuery是广泛使用的JavaScript库,它简化了JavaScript的许多方面,...

    prototype.js javaScript插件

    在实际开发中,Prototype.js可以显著提高开发效率,减少代码量,并且由于其良好的兼容性和丰富的功能,成为了许多开发者喜爱的JavaScript插件。下载并使用"prototype.js"文件,即可开始体验这些强大的功能。不过要...

    JavaScript中的prototype(原型)属性研究

    JavaScript中的prototype属性是理解面向对象编程的关键概念之一。在JavaScript中,每个函数都有一个prototype属性,这个属性指向一个对象,这个对象就是所谓的原型对象。当我们创建一个函数实例时,实例会自动获取一...

    Prototype

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

Global site tag (gtag.js) - Google Analytics