JavaScript三大毒瘤 ——— this,原型链,作用域

在我等菜鸟一步一步升级中的过程中,这三个概念总是困扰这我们(可能只有我吧,我比较蠢)。这三个东西往往都很绕,今天我就来分享一下我对原型、原型链的理解,希望各路大神看到我有错的能纠正一下,也希望能帮助到不懂的人,能逐渐把这些弄懂。

首先 要弄清楚 原型链 ,首先要知道这三个东西 prototype  [[Prototype]]  constructor 。哇 这都是什么鬼啊? 好,现在我们就详细说说这三者分别是什么东西。

prototype(原型)

我们创建的每一个 构造函数 都有一个 prototype 属性,这属性是一个 指针 ,指向一个 对象

这个对象就是我们用 new构造函数 创建的那个 对象实例 相对应继承的 原型对象,即指向自身的对象。 

可能这个不太好理解 那我们就写个例子理解一下。

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
</head>
<body>
</body>
</html>
<script>
function Person(name,gender){ // 这个就是原型,也是一个构造函数,首字母大写
this.name = name;
this.gender = gender;
}
Person.prototype.eat = "哇,贼好吃."; // 在prototype写的方法,继承他的都能使用到 var person1 = new Person("MIse","male"); // 这个就是 对象实例 他的原型就是 Person 这个构造函数 console.log(person1.name); // MIse
console.log(person1.gender); // male
console.log(person1.eat); // 哇,贼好吃. </script>

在这个例子里,Person 就是 person1 的原型 , person1 可以继承到 Person 上面 eat 的方法。

所以这个prototype的主要作用就是 将一些方法或不变的属性 写在prototype上面,从而由这个 原型对象 所创造出来的 对象实例 可以 共享他所有的方法和属性

这样写的好处就是,不用在构造函数里面定义对象实例的信息,而是可以将这些信息直接添加到原型对象中。而且节省内存,把方法存在 堆内存 中,栈内存 只存放指向这个方法的指针。

简单得科普一下 堆栈。

Javascript 分两种 基本类型引用类型

  • 基本类型 (Undefined、Null、Boolean、Number和String)

基本类型在内存中占据空间小、大小固定 ,他们的值保存在栈(stack)空间,是按值来访问

  • 引用类型 (对象、数组、函数)

引用类型占据空间大、大小不固定, 栈内存中存放地址指向堆(heap)内存中的对象。是按引用访问的

[[Prototype]] (实例内部的一个属性)

每一个 构造函数创建的 对象实例 都有一个[[Prototype]]属性。在JavaScript中,因为[[Prototype]]没有标准的访问方式,所以通常这个属性都是通过__proto__来代替访问

每个 对象实例 都有一个 __proto__ 属性,这属性也是一个 指针 ,这个指针也是指向一个 对象

这个对象就是 创建它这对象实例本身的原型对象,这个就是存在于实例与构造函数的原型对象之间的连接

这也是为什么 person1 能够访问到 Person 的方法的原因。因为 person1(对象实例)是继承于 Person(原型对象)

constructor(构造函数) 

每一个 构造函数 内部都会有一个 constructor 的属性,这个属性也是一个 指针,指向该prototype属性所在函数的指针

他的作用也就是 往这个原型 添加更多的方法或属性。

三者的关系

简单来说呢。就是。

person1.__proto__ === Person.prototype

person1.prototype.constructor 会报错

Person.prototype.constructor === Person

Person.proto === Function.prototype

Person.prototype.__proto__ === Object.prototype    因为所有函数都是由Object继承过来的

Object.prototype.proto === null

Object.proto === Function.prototype

最后

个人建议大家还是静下心来看一下这个关系图。顺着关系看多几次。一次不懂看多几次。总有一次会恍然开朗的!

因为我也是初学者。希望有写错的大家能提醒我一下,共同交流进步。谢谢!

Javascript Prototype __proto__ constructor 三者的关系的更多相关文章

  1. 简述prototype, _proto_, constructor三者的关系

    1.prototype 感概:每个函数都有一个prototype这个属性,而这个属性指向一个对象,这个对象称为原型对象 作用: a.节约内存 b.扩展属性和方法 c.实现类与类的之间的继承 2._pr ...

  2. 关于 JavaScript prototype __proto__ 一点总结

    http://www.cnblogs.com/wbin91/p/5265163.html 先上代码 function(y) Foo{ this.y = y;} Foo.prototype.x = 10 ...

  3. javascript prototype __proto__区别

    An Object's __proto__ property references the same object as its internal [[Prototype]] (often refer ...

  4. js in depth: Object & Function & prototype & __proto__ & constructor & classes inherit

    js in depth: Object & Function & prototype & proto & constructor & classes inher ...

  5. prototype,__proto__,constructor

    proto属性: 所有对象都有此属性.但它不是规范里定义的属性,并不是所有JavaScript运行环境都支持.它指向对象的原型,也就是你说的继承链里的原型.通过Object.getPrototypeO ...

  6. 实践一些js中的prototype, __proto__, constructor

    <!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...

  7. Prototype and Constructor in JavaScript

    The concept of prototype in JavaScript is very confusing, especially to those who come with a C++/JA ...

  8. illustrating javascript prototype & prototype chain

    illustrating javascript prototype & prototype chain 图解 js 原型和原型链 proto & prototype func; // ...

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

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

随机推荐

  1. android登录实现,存储数据到/data/data/包名/info.txt

    1.一个简单登录界面布局代码如下: @1采用线性布局加相对布局方式 @2线性布局采用垂直排列 <?xml version="1.0" encoding="utf-8 ...

  2. html锚点 点击跳转到页面指定位置

    本来是在看阮大神写的ajax教程,突然发现点击目录文字会跳转到相对应的文本内容,于是乎激发了我的兴趣. 这个究竟怎么做的,刚开始看的时候一知半解,找度娘就是:"点击跳转到页面指定位置&quo ...

  3. Hybrid App开发之jQuery操作DOM

    前言: 前面学习了JQuery的选择器,今天开始学习新的知识,JQuery操作DOM元素. 元素属性的访问与设置 attr(name) 获取元素属性 attr(name,value) 单个属性设置 a ...

  4. 如何运行jar文件

    比如我要执行G:/weblogic文件夹下面的wls1036_generic.jar 文件. 1.cmd 2.跳转到G盘(G:回车),如果jar文件在桌面上,运行cd desktop进入桌面再定位到文 ...

  5. ionic 的缓存 和局部刷新

    最近两天在做项目时,发现ionic的缓存功能非常方便好用,提高了再低端手机特别是android比较低版本上的流畅性!可是,后来发现,整体的缓存整个页面并不是一个一劳永逸的办法,结合局部刷新功能,感觉就 ...

  6. dubbo的简单应用

    一. dubbo简介 dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架. 二. 架构 引用dubbo的架构图: Provide ...

  7. Swift json字典转模型 项目记录

    背景 最近项目开始转用Swift3开发,由于Swift中json(字典)转模型的选择方案较多,笔者最开始选择了HandyJSON的方案,在使用一段时间后发现当要进行某个字段取值使用时需要进行各种的转化 ...

  8. HTML4,HTML5,XHTML 之间有什么区别?

    原始日期:2014-10-25 14:12 我来从HTML的历史谈谈他们3者的区别.在HTML的早期发展中,W3C成立之前,很多标准的制定都是在浏览器的开发者们互相讨论的情况下完成的,比如HTML 2 ...

  9. eclispe JavaEE 配置tomcat

    http://blog.csdn.net/hongshan50/article/details/8293526 http://blog.csdn.net/longshengguoji/article/ ...

  10. Linux终端类型

    unix是一个多用户多任务的操作系统.早期电脑昂贵,所以当时使用便宜的设备连接到电脑上(当时还没有键盘和显示器,使用纸带和卡片来输入输出)来使用操作系统,这个便宜的设备就是终端,也可以认为终端是一种控 ...