Javascript Prototype __proto__ constructor 三者的关系
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 三者的关系的更多相关文章
- 简述prototype, _proto_, constructor三者的关系
1.prototype 感概:每个函数都有一个prototype这个属性,而这个属性指向一个对象,这个对象称为原型对象 作用: a.节约内存 b.扩展属性和方法 c.实现类与类的之间的继承 2._pr ...
- 关于 JavaScript prototype __proto__ 一点总结
http://www.cnblogs.com/wbin91/p/5265163.html 先上代码 function(y) Foo{ this.y = y;} Foo.prototype.x = 10 ...
- javascript prototype __proto__区别
An Object's __proto__ property references the same object as its internal [[Prototype]] (often refer ...
- js in depth: Object & Function & prototype & __proto__ & constructor & classes inherit
js in depth: Object & Function & prototype & proto & constructor & classes inher ...
- prototype,__proto__,constructor
proto属性: 所有对象都有此属性.但它不是规范里定义的属性,并不是所有JavaScript运行环境都支持.它指向对象的原型,也就是你说的继承链里的原型.通过Object.getPrototypeO ...
- 实践一些js中的prototype, __proto__, constructor
<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...
- Prototype and Constructor in JavaScript
The concept of prototype in JavaScript is very confusing, especially to those who come with a C++/JA ...
- illustrating javascript prototype & prototype chain
illustrating javascript prototype & prototype chain 图解 js 原型和原型链 proto & prototype func; // ...
- javascript中prototype、constructor以及__proto__之间的三角关系
三者暧昧关系简单整理 在javascript中,prototype.constructor以及__proto__之间有着“著名”的剪不断理还乱的三角关系,楼主就着自己对它们的浅显认识,来粗略地理理以备 ...
随机推荐
- Python有哪些好用的语言翻译方法
最近有个需求,要将几万条数据从日语翻译成中文.因为数据的获取和处理用的是python代码,所以想先尝试翻译部分也用python实现. 目前网上查到的翻译方法有百度.有道云以及谷歌翻译,下面会对这三个方 ...
- 一篇%3CDIV%20style%3D%22FONT-SIZE%
%3CDIV%20style%3D%22FONT-SIZE%3A%2016px%22%3E1%EF%BC%8C%E6%88%91%E4%BB%A5%E4%B8%BA%E7%BB%88%E6%9C%89 ...
- 纯css实现select下拉框并排显示
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 一起学习java
一.Servlet学习 下面是Servlet一个整体的继承结构 首先说一下Servlet这个接口这个主要包含的有init,service,destroy等方法,这里主要介绍这3个 ...
- 咦,好像可以自己做个webapi框架了-IRouteHandler的使用
当我们学习到一定程度的时候,我们会想要去深入了解代码底层的东西,也更想拥有一个属于自己的框架,当然,博主也正是如此.本文可能成为编写一个webapi框架的开端.有研究MVC框架的朋友会发现,mvc框架 ...
- charles连接手机抓包
写给我自己: 如果是使用charles抓包.一定要tm的保证手机和电脑连的是一个网. 1.proxy setting,查看charles,端口 2.勾选 3.ipconfig,查看自己电脑的ip地址 ...
- 解决其他浏览器没有propertychange事件
监听实现: /** * Listener.js * 此类用于解决非ie下,通过js改变input的值时, * 无法触发其事件的问题(如:onpropertychange, oninput, oncha ...
- JDBC加载数据库驱动的方式
JDBC作为数据库访问的规范接口,其中只是定义一些接口.具体的实现是由各个数据库厂商来完成. 一.重要的接口: 1.public interface Driver 每个驱动程序类必须实现的接口.Jav ...
- [转] 传说中的WCF
这个解决方案中包含两个项目,一个叫Server,另一个叫Client,天生一对. 1.启动VS 2010,推荐用2010以上版本(2012 RC版也行),因为越高版本越好用,最好Express的,不要 ...
- MongoDB--数据库与Collection注意事项
<h2> <strong>注意事项:</strong></h2>1.数据库名注意应该全部小写,不能包含空格,最大长度为64K名称<br /& ...