IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> js 对象的prototype__proto__的理解 -> 正文阅读

[JavaScript知识库]js 对象的prototype__proto__的理解

js中对象分为两种:普通对象和函数对象。Object ,Function 是JS自带的函数对象。
普通对象和函数对象

// 普通对象的定义方法
	let a = new Object();   // typeof a === object
	let b = {}:            // typeof b === object
	let c = new function(){};  // typeof c === object
// 函数对象
	let a2 = function() {};                            // typeof a2 === function
	let b2 = new Function('str', 'console.log(str)');  // typeof b2 === function
	function c2() {}                                   // typeof c2 === function

凡是通过new Function() 创建的对象就是函数对象,其他都是普通对象。Object, Function 也是由new Function创建的。

函数对象有__proto__和prototype属性,prototype该属性指向一个对象,就是我们所说的原型对象。
prototype对象里面包含constructor构造器,该构造器是对函数对象的引用。这是一种循环引用。

普通对象有__proto__属性,该属性指向创建它的函数对象的原型对象(prototype)。

__proto__和 prototype 的区别?
proto__就是原型对象,那原型对象也是一个对象,自然也有自己的__proto,形成一种父子关系,这些__proto__组成了一个原型的大家庭——原型链,但如果一直都有__proto__,那这条链就无限长了,所以这条原型链有一个祖先,即null,这条链的用处就是当你访问某个对象的某属性时,如果这个对象不存在这个属性,那就会去__proto__里面去找,如果找不到,则去__proto__的__proto__里面去找,最终会找到null那里,如果还是找不到,则返回undefind

下面看两个例子理解proto
1、普通对象的__proto__指向的是Object的prototy,而Object的prototy也是原型对象,它也有__proto__,为了不无限循环, Object.prototype.proto=null 来结束原型链

let a = new Object();   // typeof a === object
let b = {c:a}:            // typeof b === object

普通对象的__proto__指向的是Object的prototy

a.__proto__ == Object.prototype  // true
b.__proto__ == Object.prototype  // true

这里a.proto.proto 就等于Object.prototype.proto 等于null

a.__proto__.__proto__ == Object.prototype.__proto__  // true
a.__proto__.__proto__ == null  // true

2、函数对象,函数对象有__proto__和prototype属性,函数的__proto__是Function.prototype,
Function.prototype是个函数对象,理论上他的proto应该指向 Function.prototype,就是他自己,自己指向自己,没有意义。函数对象也是对象,所以它指向Object.prototype。Object.prototype.proto === null,保证原型链能够正常结束。

let a1 = new Function()   // typeof a1 === function
let b1 = new a1()   // typeof b1 === object

a1是函数对象,是通过new Function()创建,所以Object.__proto__指向Function.prototype。

a1.__proto__==Function.prototype  // true

Function 是对象函数,所以Function.__proto__指向Object.prototype

a1.__proto__.__proto__==Object.prototype  // true

这里是b1 b1由a1创建 ,b1的__proto__就是a1.prototype

b1.__proto__==a1.prototype  //true

b1.__proto__是a1.prototype,a1.prototype的__proto__是 Object.prototype

b1.__proto__.__proto__== Object.prototype //true

Object.prototype的 __proto__是null 结束原型链所以

b1.__proto__.__proto__.__proto__==null  // true

总结:
1.__proto__是对象的具有的属性,而prototype只有函数对象才有。
2.由__proto__组成的复杂关系叫原型链,作用就是放在原型的东西可以直接取到。
3、原型链不会无限循环 它最终指向的是null
4、函数对象Function.prototype,的proto指向的不是自己是Object.prototype,它最终指向的也是null

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:27:10  更:2022-03-04 15:27:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:36:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码