如何理解_proto_和prototype

2019-05-26 admin

原型空间

我们知道在js中万物皆对象,现在我们假设每一个对象创建时都会产生一个原型空间(原型对象 )

现在我们记住三句话

实例由其定义共享原型空间 由__proto__来寻找定义的原型空间 由prototype来寻找自己的原型空间

实例由其定义共享原型空间

ps

p:prototype
[p]: _proto_
此图片为转载

此图片为转载


从上面两张图可以清楚看出这种关系这样就可以形成原型链

所有函数都是由Function构造函数构造的 function函数也是Function构造函数构造的所以时function自己构造了自己所以自己指向自己的原型空间 我们可以看出图中function的原型空间和animal的原型空间都是object类型(其实第二列的原型空间都是object的实例,但逻辑上不是)

//所有函数类型的隐式原型都相同 因为都是Function的原型对象创建
//所以构造函数的__proto__是Function
//那么Function的隐式原型 ?
var fun = new Function();
console.log(fun.__proto__===Function.prototype);
console.log(Function.__proto__===Function.prototype);
//所以Function本身的隐式原型和显示原型相同
//可以看出Object也是函数定义的所以他的隐士原型应该是Function 的显示原型
console.log(Object.__proto__===Function.prototype)

那么object的原型空间的原型空间应该是undefined但这样就会让原型链没有尽头 为了逻辑完善就令其为null 可以看出原形空间的定义是由其定义的原型空间来定义的(实例和其定义共享原型空间)

function Animal(){}
function Bird(){}
function Swallow(){}
Bird.prototype= new Animal()
Swallow.prototype=new Bird() 
var swallow = new Swallow()
console.log(swallow.__proto__.prototype)
console.log(Swallow.__proto__.prototype)
console.log(Bird.__proto__.prototype)
console.log(Animal.__proto__.prototype)
console.log(Function.prototype.__proto__.prototype)
console.log(Swallow.prototype)
console.log(Animal.prototype)
var animal = new Animal
console.log(animal.__proto__.__proto__)
var obj = {}
console.log(typeof (obj.__proto__.__proto__))
////ps没有修正construct

那么若假设Pobject来定义了Object的原型空间的原型空间那么图中所有的(undefined)的位置的_proto_都会指向Pobject的原型空间以这个逻辑就可以让无限迭代下去(指针的指针的…的指针) 这样向上寻找原型链和向下寻找原型链就统一了,但js设计封锁了向上无限迭代(Object的原型空间为null)

[转载]原文链接:https://segmentfault.com/a/1190000019296224

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处。

转载请注明:文章转载自 JavaScript中文网 [https://www.javascriptcn.com]

本文地址:https://www.javascriptcn.com/read-65767.html

文章标题:如何理解_proto_和prototype

相关文章
如何编写干净高效的CSS代码
其实CSS的学习并不困难,但在一些较为大型的项目中就显得杂乱无章,变得很难管理,尤其是不同的人编写CSS的风格总会略有不同,从团队合作的层面上来说,就更加难以沟通,所以,我们为此总结了一些如何实现高效整洁的CSS代码原则: 使用Reset但...
2015-11-12
2015 Web 2.0和AJAX如何做好优化
2015如何让做好web2.0和ajax的优化?JavaScript中文网总结当下提出以下四大优化意见,旨在帮助W前端开发人员有效利用APM解决上述问题。 随着Web应用程序速度与效率快速增长,网站已经成为企业与其客户进行交互的第一途径——...
2015-11-12
何为闭包?有关JS闭包的一些理解
简单一点的说:闭包就是能够读取其他函数内部变量的函数。那如何实现读取其它函数内部变量呢,大家都知道在JavaScript中内部函数可以访问其父函数中的变量,那如果将内部函数返回是不是代表能够通过它访问其父函数中的变量了呢,闭包的原理事实上就...
2015-11-11
2015年将会有大量基于HTML5和JS的WEB应用
随着HTML5的定稿,以及JS的迅速发展,我们有理由相信,在接下来的一年里,将会涌现出大量的WEB应用,网站的表现形式将不再仅仅局限于过去的形式,必将在2015年引来一次重大改革! ...
2015-11-12
mpvue 小程序如何开启下拉刷新,上拉加载?
https://developers.weixin.qq.com/miniprogram/dev/api/pulldown.html#onpulldownrefresh 小程序API 微信小程序之下拉加载和上拉刷新 微信小程序下拉加载和上拉...
2018-05-25
jquery拼接ajax 的json和字符串拼接的方法
整理文档,搜刮出一个jquery拼接ajax 的json和字符串拼接的代码,稍微整理精简一下做下分享。 jQuery拼接字符串ajax <form id="myForm" action="#"&...
2017-04-01
JavaScript和Java
JavaScript和Java在某些方面相似但完全不同。 JavaScript语言类似于Java但是没有Java的静态类型和强类型检查,不过它们的语法和 C 语言都很相似。 JavaScript基于原型的对象模型,而不是更常见的基于类的对象...
2015-11-12
如何使用JavaScript
一、应用<script>标签加入JavaScript 任何脚本语言均可以通过<script>…</script>标记对加入到HTML代码中(即是加入到网页文档<html>…</html&...
2015-11-12
JavaScript基本语法和规范
JavaScript是区分大小写的,使用Unicode字符集。 在JavaScript中,语句以“;”结尾。 JavaScript脚本的源文本被从左到右执行。 虽然有时“;”是不必要的,但我们建议总是在你的语句结束处添加分号;它将避免副作用...
2015-11-12
数据类型和结构
ECMAScript标准定义了七种数据类型 1)布尔值(true 和 false) 2)null,一个特殊的关键字表示空,要注意,javascrip是区分大小写的,所以Null和null是不一样的 3)undefined 表示未定义 4)N...
2015-11-12
回到顶部