前言:用了这么久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对象。

下面是个应用这个方法拓展实例的小例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var shape = function () {
};
var p = {
    a: function () {
        console.log('aaa');
    }
};
shape.prototype = p;
 
var circle = new shape();
 
circle.a();
 
//输出'aaa'

 

好啦,到这里就讲完啦~~撒花哈哈哈哈~~~

最新文章

  1. PHP-Redis扩展使用手册(一)
  2. NDK-JNI实战教程(二) JNI官方中文资料
  3. 下载安装resin-3.X服务器并配置到myeclipse
  4. WebService优点和缺点小结(转)
  5. Xtrabackup之innobackupex备份恢复详解(转)
  6. CentOS 安装中文输入法
  7. 文件I/O(不带缓冲)之creat函数
  8. 关于webstorm(phpstorm)设置了编码格式之后还是乱码的问题
  9. 最大公约数(gcd):Euclid算法证明
  10. JDBC插入百万数据,不到5秒!
  11. Multiwii 代码解读
  12. C# 关于数据类型转换
  13. Python主要模块和常用方法简览
  14. 【Android基础】Activity之间进行参数传递的三种方式
  15. smtp中ehlo的使用
  16. Java模式之模板方法模式
  17. bootstrap学习总结
  18. django聚合查询
  19. Python 函数(参数组合)
  20. Intellij IDEA 导入Eclipse的Web项目

热门文章

  1. java的super和this关键字用法总结
  2. 使用HTML引用标签来分隔Ticket回复
  3. python的eval、exec函数使用总结
  4. SpringBoot 返回json 字符串(jackson 及 fast json)
  5. flask中的蓝图与红图
  6. openssl - cookbook
  7. win10 + Ubuntu 双系统,重装后的引导修复,时间调整和启动项调整
  8. php的精确计算
  9. WordPress换域名的301跳转方法(经典)
  10. 50. linux下查看tomcat日志