关于JavaScript中prototype机制的理解
最近几天一直在研究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机制的理解的更多相关文章
- 在 JavaScript 中 prototype 和 __proto__ 有什么区别
本文主要讲三个 问题 prototype 和 proto function 和 object new 到底发生了什么 prototype 和 proto 首先我们说下在 JS 中,常常让我们感到困惑的 ...
- Javascript中prototype属性详解 (存)
Javascript中prototype属性详解 在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不 ...
- (转载)详解Javascript中prototype属性(推荐)
在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...
- JavaScript中继承机制的模仿实现
首先,我们用一个经典例子来简单阐述一下ECMAScript中的继承机制. 在几何学上,实质上几何形状只有两种,即椭圆形(是圆形的)和多边形(具有一定数量的边).圆是椭圆的一种,它只有一个焦点.三角形. ...
- Javascript中prototype属性详解
在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...
- Javascript中prototype属性的详解
原文链接:http://www.cnblogs.com/Uncle-Keith/p/5834289.html 在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象 ...
- javascript中prototype、constructor以及__proto__之间的三角关系
三者暧昧关系简单整理 在javascript中,prototype.constructor以及__proto__之间有着“著名”的剪不断理还乱的三角关系,楼主就着自己对它们的浅显认识,来粗略地理理以备 ...
- javascript中关于继承的理解
首先,你要理解在javascript中,每当一个新函数创建时,都会生成一个prototype属性,我们管它叫做原型对象.看一个例子: function foo(){ this.name='qiangq ...
- Javascript中prototype属性
prototype作为JS相对比较难理解的一个知识点,在这里发表下自己的理解. 本文将包含以下几部分内容: 1.js prototype的简单介绍, 2.js构造函数的介绍, 3.prototype的 ...
随机推荐
- Weblogic多数据源(Multi Data Sources)应用实践
原创 2012年03月29日 10:55:28 标签: weblogic / 数据库 / 负载均衡 / 数据中心 / jdbc / 应用服务器 大型系统在进行数据库部署时,常常会分为主数据应用中心 ...
- SVN merge 三种方式
1.Merge a range of revisions 2.Reintegrate a branch 3.Merge two different trees ———————————————————— ...
- CentOS7设置DNS服务器
CentOS7设置DNS服务器 在CentOS7下,手工设置 /etc/resolv.conf 里的DNS,过了一会,发现被系统重新覆盖或者清除了.CentOS7和CentOS6下的设置DNS方法不一 ...
- Linux程序
1.如何找到一个进程的安装程序目录与启动目录 2.如何完全卸载一个程序
- eclipse高速查找一个变量、方法或者类被引用的地方
近期不停debug,拿到一个变量之后总是要先概览一下才好下手,之前一直用Ctrl+F来做,太麻烦. 今天查了下eclipse使用,发现有快捷键,用法: 先双击要查看的变量.方法或者类,使之被选中,然后 ...
- Iptables实现公网IP DNAT/SNAT
Iptables实现NAT是最基本的功能,大部分家用路由都是基于其SNAT方式上网,使用Iptables实现外网DNAT也很简单,不过经常会出现不能正常NAT的现象.以下命令将客户端访问1.1.1.1 ...
- HTTP头解读
Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET.POST.PUT.DELETE.一个URL地址用于描述一个网络上的资源, 而HTTP中的GET.POST.PUT. DELETE ...
- 监听iOS检测屏幕旋转状态,不需开启屏幕旋转
-(void)rotation_icon:(float)n { UIButton *history_btn= [self.view viewWithTag:<#(NSInteger)#>] ...
- VueJS样式绑定v-bind:class
class 与 style 是 HTML 元素的属性,用于设置元素的样式,我们可以用 v-bind 来设置样式属性. Vue.js v-bind 在处理 class 和 style 时, 专门增强了它 ...
- 1.1 合用weightSum属性和layout_weight属性
<打造高质量Android应用:Android开发必知的50个诀窍>第1章活用布局,本章将介绍Android布局相关的一些窍门和建议.通过本章,读者不仅可以学习如何从零开始创建特定类型的布 ...