【转】Javascript 原型链之原型对象、实例和构造函数三者之间的关系
前言:用了这么久js,对于它的原型链一直有种模糊的不确切感,很不爽,隧解析之。
本文主要解决的问题有以下三个:
(1)constructor 和 prototype 以及实例之间啥关系?
(2)prototype是啥,__proto__又是啥,他们之间啥关系?
(3)如果改变一个 constructor 的 prototype,他的实例会发生什么改变?
ok,下面一个一个解决。
(1)constructor 和 prototype 以及实例对象三者之间啥关系?
举例:

如上,当我们创建一个函数,系统就会为这个函数自动分配一个prototype指针,指向它的原型对象。并且可以发现,这个原型对象包含两个部分(constructor 和 __proto__)其中constructor指向函数自身。(这里形成了一个小闭环)
当我们将该函数作为模版创建实例(new方法)的时候,我们发现创建出的实例是一个与构造函数同名的object,这个object是独立的,他只包含了一个__proto__指针(实例没有prototype,强行访问则会输出undefined),这个指针指向上面提到的构造函数的prototype原型对象。
这时候我们发现三者形成了一个大"闭环"。之所以加上引号,因为构造函数和实例之间无法直接访问,需要通过__proto__指针间接读取。

这个"大闭环"画出来就是下面这个样子啦:

到此第一个问题已经解决。
(2)prototype是啥,__proto__又是啥,他们之间啥关系?
在上一个问题中,我们用到了实例对象的__proto__指针,实际上在JavaScript中大部分类型的值都拥有__proto__属性,例如:



当然object和function对象也有:

不过也有不存在__proto___属性的类型,比如:


等等。
然而。只有function对象才有prototype属性,其他任何类型的值都没有。即使是使用new方法从function构造出的实例对象也没有prototype属性。

(object类型的值的prototype输出undefined)

(我们改变了test的prototype的值,将其链接到一个函数名为test的函数,接着,函数类型的值的prototype输出了一个原型对象)
so,do you understand?
(3)如果改变一个 constructor 的 prototype,他的实例会发生什么改变?
我们来做一个尝试:

我们可以发现,改变了prototype之后创建的实例指向了新的prototype对象,而之前的依然指向老的prototype对象。
下面是个应用这个方法拓展实例的小例子:
var shape = function () {
};
var p = {
a: function () {
console.log('aaa');
}
};
shape.prototype = p;
var circle = new shape();
circle.a();
//输出'aaa'
从传统IT快速走向公共云计算
在阿里云上遇见更好的Oracle(二)
Oracle 11g 审计跟踪管理
在阿里云上遇见更好的Oracle(一)
Elasticsearch中的DocValues
初识Django —Python API接口编程入门
为什么mysqld启动报错
云计算产品的四件套
说说云计算中的地域和可用区概念
- 最新文章
-
LeetCode Array Easy 66. Plus One
排序算法---希尔排序
排序算法---插入排序
排序算法---选择排序
图片放大镜 类淘宝--实现一个页面多张图片都可以进行放大
为IIS服务器配置SSL,并设置为默认使用https协议访问网站
出现异常: 非介入式客户端验证规则中的验证类型名称必须唯一。下列验证类型出现重复: required
关于导出Excel出现异常的解决办法。:System.UnauthorizedAccessException: 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败
理解EntityFramework两个核心类型的职责 DbSet和D'bContext
C#5.0 异步编程 Async和Await--异步方法的规范和注意事项
- 热门文章
-
HDU 5727 Necklace 环排+二分图匹配
codeforces 696C PLEASE 概率dp+公式递推+费马小定理
codeforces 696B Puzzles 树形概率计算
AtCoder Grand Contest 001 C Shorten Diameter 树的直径知识
codeforces 696A Lorenzo Von Matterhorn 水题
codeforces 691F Couple Cover 暴力
codeforces 691D Swaps in Permutation DFS
codeforces 691E Xor-sequences 矩阵快速幂
codeforces 690C3 Brain Network
Codeforces Round #361 (Div. 2) 套题