最近几天一直在研究JavaScript中原型的机制,从开始的似懂非懂,到今天终于有所领悟。不敢说彻底理解,但是起码算知道怎么回事了。

  为什么一开始似懂非懂

  开始了解一遍原型机制后,感觉知其然但不知其所以然,只知道每个函数(Foo)内部都有一个原型对象(prototype),并且该函数对象的实例(new Foo())会有一个内部指针(_proto_)指向该原型。如下图所示:

  这个机制不算复杂,但也是知其然不知其所以然,主要是有下面两个疑问:

  1.函数(Foo)维护这个prototype对象有什么用,即上图这个foo对象能用来干什么。

  2.为什么函数(Foo)会有prototype和_proto_两个指针,而对象(new Foo())只有_proto_一个指针。(这里需要说明函数也是对象,只是比对象多了一些特性)

  先回答第一个问题。

  函数维护一个原型对象,是为了保存其所有实例化对象都能访问的属性和方法,从另一个角度说,是把其prototype对象设置为其实例化对象的父类,使JS语言具有继承的特性。因此一个函数的原型对象,是可以人为赋值为任意一个对象,如此该函数的所有实例化对象都能访问到该对象的属性和方法。prototype也被称为显式原型。

  回答第二个问题。

  从上面的描述可以知道,prototype是(构造)函数用来指定父类的,而函数特定的实例化对象,只需要一个指针来指向该父类即可。也就是_proto_指针,并且该指针就是指向其构造函数的原型,不可人为改变。_proto_也被称为隐式原型。

  总结来说,JavaScript原型机制是做什么用,就是通过两个指针的配合,实现该语言的继承特性,毕竟JavaScript是完全面向对象的语言嘛。

  另外不要忘了Foo和foo本身也是对象,它们各自也有自己的隐式原型,其中Foo的_proto_指向Function的prototype,foo的_proto_指向Object的prototype。上图的完整版如下所示。

  下面粘贴一些其它博文的描述,帮助理解。

  “在原型模型中,为了实现类继承,必须首先将子类构造函数的prototype设置为一个父类的对象实例。创建这个父类对象实例的目的就是为了构成原型链,以起到共享上层原型方法作用。”

  “用 var anObject = new aFunction() 形式创建对象的过程实际上可以分为三步:第一步是建立一个新对象;第二步将该对象内置的原型对象设置为构造函数prototype引用的那个原型对象;第三步就是将该对象作为this参数调用构造函数,完成成员设置等初始化工作。对象建立之后,对象上的任何访问和操作都只与对象自身及其原型链上的那串对象有关,与构造函数再扯不上关系了。换句话说,构造函数只是在创建对象时起到介绍原型对象和初始化对象两个作用。”---也就是说Foo的意义只在于构建foo与new Foo()这根链条,构建成功之后,它就功成身退了。

  功力有限,如果错误欢迎指正。

关于JavaScript中prototype机制的理解的更多相关文章

  1. 在 JavaScript 中 prototype 和 __proto__ 有什么区别

    本文主要讲三个 问题 prototype 和 proto function 和 object new 到底发生了什么 prototype 和 proto 首先我们说下在 JS 中,常常让我们感到困惑的 ...

  2. Javascript中prototype属性详解 (存)

    Javascript中prototype属性详解   在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不 ...

  3. (转载)详解Javascript中prototype属性(推荐)

    在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...

  4. JavaScript中继承机制的模仿实现

    首先,我们用一个经典例子来简单阐述一下ECMAScript中的继承机制. 在几何学上,实质上几何形状只有两种,即椭圆形(是圆形的)和多边形(具有一定数量的边).圆是椭圆的一种,它只有一个焦点.三角形. ...

  5. Javascript中prototype属性详解

    在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...

  6. Javascript中prototype属性的详解

    原文链接:http://www.cnblogs.com/Uncle-Keith/p/5834289.html 在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象 ...

  7. javascript中prototype、constructor以及__proto__之间的三角关系

    三者暧昧关系简单整理 在javascript中,prototype.constructor以及__proto__之间有着“著名”的剪不断理还乱的三角关系,楼主就着自己对它们的浅显认识,来粗略地理理以备 ...

  8. javascript中关于继承的理解

    首先,你要理解在javascript中,每当一个新函数创建时,都会生成一个prototype属性,我们管它叫做原型对象.看一个例子: function foo(){ this.name='qiangq ...

  9. Javascript中prototype属性

    prototype作为JS相对比较难理解的一个知识点,在这里发表下自己的理解. 本文将包含以下几部分内容: 1.js prototype的简单介绍, 2.js构造函数的介绍, 3.prototype的 ...

随机推荐

  1. [ios]objective-c 协议和委托 (重点基础知识)

    objective-c protocol delegateprotocol-协议,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现. delegate-委托,顾名思义就是委托 ...

  2. GridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL)不兼容低版本号系统解决方式

    项目开发中须要使用GridView批处理操作,多项选择. 可是GridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL)不兼容低版本号. 找 ...

  3. Google SEO 学习网站记录

    在搜索结果中创建良好的标题和摘要: https://support.google.com/webmasters/answer/35624?hl=zh-Hans&ref_topic=600194 ...

  4. 转: 使用maven给spring项目打可直接运行的jar包(配置文件内置外置的打法)

    from:  http://www.cnblogs.com/hdwang/p/5418747.html

  5. C#反射获取属性值和设置属性值

    /// /// 获取类中的属性值 /// public string GetModelValue(string FieldName, object obj) { try { Type Ts = obj ...

  6. JAVA_StandardServer await create[8005]怎么办

    Tomcat 6.0 错误信息: 严重: StandardServer.await:create[8005]: java.net.BindException: Address already in u ...

  7. mongodb模拟生产环境的分片集群

       分片是指数据拆分 将其分散在不同的机器上的过程,有时候也叫分区来表示这个概念.将数据分散到不同机器上 不需要功能强大的计算机就可以储存更多的数据,处理更大的负载.        几乎所有的数据库 ...

  8. java导出excel不须要额外jar包

    眼下我知道的在java中导出Excel能够用poi或在jsp的文件头改变输出流. 以下再介绍一种就用java基础包导出的Excel.导出的格式形如: 源代码例如以下: package csvExcel ...

  9. Oracle 修改带数据的字段类型

    http://www.cnblogs.com/LDaqiang/articles/1157998.html由于需求变动,现要将一个类型NUMBER(8,2)的字段类型改为 char.大体思路如下:   ...

  10. 关于layui-layer独立组件--弹出层

    官方下载文档链接:http://layer.layui.com/ =================================================================== ...