- 浏览: 7935602 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (2425)
- 软件工程 (75)
- JAVA相关 (662)
- ajax/web相关 (351)
- 数据库相关/oracle (218)
- PHP (147)
- UNIX/LINUX/FREEBSD/solaris (118)
- 音乐探讨 (1)
- 闲话 (11)
- 网络安全等 (21)
- .NET (153)
- ROR和GOG (10)
- [网站分类]4.其他技术区 (181)
- 算法等 (7)
- [随笔分类]SOA (8)
- 收藏区 (71)
- 金融证券 (4)
- [网站分类]5.企业信息化 (3)
- c&c++学习 (1)
- 读书区 (11)
- 其它 (10)
- 收藏夹 (1)
- 设计模式 (1)
- FLEX (14)
- Android (98)
- 软件工程心理学系列 (4)
- HTML5 (6)
- C/C++ (0)
- 数据结构 (0)
- 书评 (3)
- python (17)
- NOSQL (10)
- MYSQL (85)
- java之各类测试 (18)
- nodejs (1)
- JAVA (1)
- neo4j (3)
- VUE (4)
- docker相关 (1)
最新评论
-
xiaobadi:
jacky~~~~~~~~~
推荐两个不错的mybatis GUI生成工具 -
masuweng:
(转)JAVA获得机器码的实现 -
albert0707:
有些扩展名为null
java 7中可以判断文件的contenttype了 -
albert0707:
非常感谢!!!!!!!!!
java 7中可以判断文件的contenttype了 -
zhangle:
https://zhuban.me竹板共享 - 高效便捷的文档 ...
一个不错的网络白板工具
http://leonard-peng.github.io/2017/01/21/proto/
之前常听说 JavaScript 的面向对象是构建于原型链(protype chain)上的,通过逐级向上查找直至 Object 的原型为止,但是具体的工作机制不太清楚,今天查阅了资料,才发现原来自己之前把 __proto__ 与 prototype 混为一谈了(冏o(╯□╰)o)。
结论
先抛出来结论:
__proto__ 是原型链查询中实际用到的,它总是指向 prototype;
prototype 在定义构造函数时自动创建,它总是被 __proto__ 所指。
从上面两点我们还可以推出 prototype 只能作为构造函数的属性,而 __proto__ 可以作为任意对象的属性。
细探
接下来通过一段代码具体的研究一下:
function Foo(y) { this.y = y; };
Foo.prototype.x = 10;
FOo.prototype.calculate = function () { ... };
let b = new Foo(20);
let c = new Foo(30);
这段代码构建的原型链可以用下面的图来表示:
看上去是不是有些晕? 没关系,看完这篇文章就会觉得很简单了。
原型链解释
首先聚焦于图的中央,也就是蓝色和灰色的块。代码的第一行 function Foo(age) { ... }; 定义了构造函数 Foo,此时 Foo 的原型便自动创建,它的 constructor 属性指向 Foo,Foo 的 prototype 属性指向刚刚创建的原型:
1
Foo.prototype.constructor === Foo; // true
接着再看图的左部,也就是黄绿色的块。代码的第四、五行通过 let b = new Foo(20); let c = new Foo(20); 创建了对象 b 和 c,每当我们通过 new Foo(x) 创建对象时,JavaScript 内部会首先创建一个新的对象,将其 __proto__ 属性指向 Foo 的原型,也就是 Foo.prototype,然后将构造函数中的 this 指向刚刚创建的新对象,最后再执行构造函数中的代码:
1
2
b.__proto__ === Foo.prototype; // true
c.__proto__ === Foo.prototype; // true
最后来说说剩下的紫色的块。
既然原型链是一条链,那么它就一定会有起始点。文章的开头就说过原型链查找是逐级向上查找直至 Object 的原型为止,所以说起始点就是 Object.prototype,自然 Object.prototype.__proto__ 的值为 null(因为已经到了链头,链结束了)。
尽管 Foo 是构造函数,但它仍逃不出函数的范畴,所以它的 __proto__ 指向函数的原型,也就是 Function.prototype。
一切原型链的终点都是 Object.prototype,所以 Foo.prototype.__proto__ 和 Function.prototype.__proto__ 均指向它。
Foo.__proto__ === Function.prototype; // true
Foo.prototype.__proto__ === Object.prototype; //true
Function.prototype.__proto__ === Object.prototype; // true
Object.prototype.__proto__ === null; // true
原型链工作原理
一句话解释就是:原型链查找就是通过 proto 查找,查找至值为 null (也就是 Object.prototype)时结束,通过几个具体的例子来说明一下:
b.y 在 b 中找到 y,结果为 20;
b.x 在 b 中未找到 x,接着通过 b.__proto__ 在 Foo.prototype 中找到 x,结果为 10;
b.toString() 在 b 中未找到 toString 方法;接着通过 b.__proto__ 在 Foo.prototype 中寻找,未找到;继续通过 Foo.prototype.__proto__ 在 Object.prototype 中寻找,找到,结果为 ‘[object Object]’。
b.noFunc() 依次在 b、Foo.prototype、Object.prototype 中寻找,均未L找到,抛出错误。
之前常听说 JavaScript 的面向对象是构建于原型链(protype chain)上的,通过逐级向上查找直至 Object 的原型为止,但是具体的工作机制不太清楚,今天查阅了资料,才发现原来自己之前把 __proto__ 与 prototype 混为一谈了(冏o(╯□╰)o)。
结论
先抛出来结论:
__proto__ 是原型链查询中实际用到的,它总是指向 prototype;
prototype 在定义构造函数时自动创建,它总是被 __proto__ 所指。
从上面两点我们还可以推出 prototype 只能作为构造函数的属性,而 __proto__ 可以作为任意对象的属性。
细探
接下来通过一段代码具体的研究一下:
function Foo(y) { this.y = y; };
Foo.prototype.x = 10;
FOo.prototype.calculate = function () { ... };
let b = new Foo(20);
let c = new Foo(30);
这段代码构建的原型链可以用下面的图来表示:
看上去是不是有些晕? 没关系,看完这篇文章就会觉得很简单了。
原型链解释
首先聚焦于图的中央,也就是蓝色和灰色的块。代码的第一行 function Foo(age) { ... }; 定义了构造函数 Foo,此时 Foo 的原型便自动创建,它的 constructor 属性指向 Foo,Foo 的 prototype 属性指向刚刚创建的原型:
1
Foo.prototype.constructor === Foo; // true
接着再看图的左部,也就是黄绿色的块。代码的第四、五行通过 let b = new Foo(20); let c = new Foo(20); 创建了对象 b 和 c,每当我们通过 new Foo(x) 创建对象时,JavaScript 内部会首先创建一个新的对象,将其 __proto__ 属性指向 Foo 的原型,也就是 Foo.prototype,然后将构造函数中的 this 指向刚刚创建的新对象,最后再执行构造函数中的代码:
1
2
b.__proto__ === Foo.prototype; // true
c.__proto__ === Foo.prototype; // true
最后来说说剩下的紫色的块。
既然原型链是一条链,那么它就一定会有起始点。文章的开头就说过原型链查找是逐级向上查找直至 Object 的原型为止,所以说起始点就是 Object.prototype,自然 Object.prototype.__proto__ 的值为 null(因为已经到了链头,链结束了)。
尽管 Foo 是构造函数,但它仍逃不出函数的范畴,所以它的 __proto__ 指向函数的原型,也就是 Function.prototype。
一切原型链的终点都是 Object.prototype,所以 Foo.prototype.__proto__ 和 Function.prototype.__proto__ 均指向它。
Foo.__proto__ === Function.prototype; // true
Foo.prototype.__proto__ === Object.prototype; //true
Function.prototype.__proto__ === Object.prototype; // true
Object.prototype.__proto__ === null; // true
原型链工作原理
一句话解释就是:原型链查找就是通过 proto 查找,查找至值为 null (也就是 Object.prototype)时结束,通过几个具体的例子来说明一下:
b.y 在 b 中找到 y,结果为 20;
b.x 在 b 中未找到 x,接着通过 b.__proto__ 在 Foo.prototype 中找到 x,结果为 10;
b.toString() 在 b 中未找到 toString 方法;接着通过 b.__proto__ 在 Foo.prototype 中寻找,未找到;继续通过 Foo.prototype.__proto__ 在 Object.prototype 中寻找,找到,结果为 ‘[object Object]’。
b.noFunc() 依次在 b、Foo.prototype、Object.prototype 中寻找,均未L找到,抛出错误。
发表评论
-
微信开发工具中时间问题的小坑
2018-02-07 19:07 816刚开始用微信小程序开发工具,每次运行任何应用,都报这个错误: ... -
三篇不错的介绍CSS GRID的文章
2017-12-06 09:08 529三篇不错的介绍CSS GRID的文章: http://www. ... -
双因素认证(2FA)教程
2017-11-03 09:16 1570http://www.ruanyifeng.com/blog/ ... -
es6 中的export
2017-08-20 08:00 814https://juejin.im/post/5998625f ... -
markdown中的空格
2017-08-20 07:53 1694即使手动输入空格, 也是很不推荐的方法。我推荐全角空格,切换 ... -
(转)讲真,别再使用JWT了
2017-08-17 23:21 1007不错的好文: http://insights.thoughtw ... -
(转)手把手教你WebStorm+chrome实现时时调试刷新
2017-08-15 10:50 3019参考: http://jingyan.baidu.com/ar ... -
IntelliJ Idea 2017 免费激活方法
2017-08-15 09:38 93121. 到网站 http://idea.lanyus.com/ ... -
前端框架这么多,该何去何从?
2017-08-04 07:17 644http://insights.thoughtworkers. ... -
记录一个HTML 5画拓扑图的商业公司
2017-07-18 19:56 844http://qunee.com/ DEMO:http:// ... -
vue 2例子学习收集
2017-07-16 11:46 9981 vue2.0手撸闲鱼App https://githu ... -
(收藏)虚拟DOM内部是如何工作的
2017-07-13 22:08 587虚拟DOM内部是如何工作的 https://segmentfa ... -
最近看到的几篇精彩JAVASCRIPT博客文章推荐
2017-07-11 07:10 561【深度长文】JavaScript数组所有API全解密 http ... -
jsonp 跨域原理:深入浅出 jsonp
2017-07-10 19:55 1427https://lzw.me/a/jsonp.html jso ... -
(转)深度长文-JavaScript数组所有API全解密
2017-07-08 19:59 816深度长文-JavaScript数组所有API全解密 http: ... -
(收藏)网页导出PDF的方案
2017-07-06 07:13 959(收藏)网页导出PDF的方案 https://yiqiwuli ... -
Chromium 新的弹窗机制以及 HTML 的 <dialog> 元素
2017-06-28 12:37 1144https://juejin.im/post/59525195 ... -
国内一个不错的大屏UI设计厂家
2017-06-03 19:43 3156http://www.lanlanwork.com/dp.ph ... -
canvas仿芝麻信用分仪表盘
2017-05-28 20:21 1584canvas仿芝麻信用分仪表盘 https://segment ... -
(转)CSS 变量教程
2017-05-10 21:12 572http://www.ruanyifeng.com/blog/ ...
相关推荐
分析javascript中 prototype __proto__ constructor之间的关系
- `__proto__`指向`prototype`,两者之间的关系构成了原型链。 - `Object.getPrototypeOf()`是标准且安全的方法,推荐用于获取对象的原型,而`__proto__`虽然方便但非标准。 - 继承和属性查找主要是通过原型链...
JavaScript中的`prototype`、`__proto__`和`constructor`是理解JavaScript面向对象编程的关键概念。这篇文章通过图解的方式深入浅出地解析了这三个概念之间的关系。 首先,`__proto__`属性是对象独有的,它指向对象...
在JavaScript中,prototype和__proto__是理解对象原型继承机制的关键知识点。下面将详细介绍这两者之间的关系以及它们在JavaScript对象继承中所扮演的角色。 首先,prototype属性是函数所独有的。在JavaScript中,...
主要给大家介绍了关于Javascript中prototype与__proto__的关系的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
标题 "prototype_oop_javascript_ruby_prototype_" 暗示了我们将探讨的是关于原型(Prototype)面向对象编程(Object-Oriented Programming, OOP)的概念,主要关注JavaScript和Ruby这两种语言之间的相似性和差异性...
__proto__是内部原型,prototype是构造器原型(构造器其实就是函数) 构造器的原型(prototype)是一个对象 那什么是构造器呢? 要想创建一个对象,首先要有一个对象构造器,就像php里面一样,要想创建一个对象,...
这里讨论下对象的内部原型(__proto__)和构造器的原型(prototype)的关系。 一、所有构造器/函数的__proto__都指向Function.prototype,它是一个空函数(Empty function) 代码如下: Number.__proto__ === Function....
如上图所示,我创建了两个对象person1 与 person2,这两个对象都要调用study 这个函数,这样就会在内存开辟两个study空间,但函数实现的功能都是一样的,所以这样太浪费内存空间了,所以原型的出现就是为了解决了这...
AH/ESP IPSec load balancing support for IPVS
JavaScript中的原型(Prototype)机制是实现继承的一种方式,它涉及到两个关键的概念:`prototype`和`__proto__`。这两个属性在JavaScript的对象和函数中扮演着不同的角色。 首先,`prototype`属性主要用于函数对象...
JavaScript中的`prototype`、`__proto__`和`constructor`是理解JavaScript面向对象编程的关键概念。这篇文章将通过图解的方式帮助读者深入理解这三个属性的关系。 首先,`__proto__`属性,它存在于每个对象中,表示...
在工作中有时候会看到prototype和__proto__这两个属性,对这两个属性我一直比较蒙圈,但是我通过查阅相关资料,决定做一下总结加深自己的理解,写得不对的地方还请各位大神指出。 跟__proto__属性相关的两个方法 ...
它的作用就是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(可以理解为父对象)里找,如果父对象也不存