JavaScript原型与原型链深入理解
原型:
每一个js 对象(null除外)都会和另一个对象相关联,“另一个”对象就被我们称之为‘原型’,
而每一个原型拥有一个prototype 属性指向原型对象(就是原型的实例)的引用,
原型就是通过该prototype将自身的属性和方法共享给继承他的子对象;
子对象通过__proto__指向原型的prototype进行属性方法继承;这种方式称之为‘原型链’
如图
- 其实Function 最特殊(函数界一等公民) 它是它自己的一个实例 ;
如:
Function(){}
let F = new Function();
Function.prototype = F;
Function.__proto__ = F;
就是说 Funciton 的原型就是F , 即Function.__proto__ === Function.prototype,
所 Function.constructor === Function
而 Function.prototype.__proto__ === {} ,没有再指向F而是{}避免了无意义的死循环
- 而Object 也是new Function()来的,
即Object.__proto__=F,
所Object.__proto__ === Function.prototype
而
Object.prototype ==={}
此处同Function.prototype.__proto__同理最终他的原型对象并没有再指向F; 而是指向了最上层的{} 一个空对象,
简单分析不难得出 要是他的原型对象和原型都指向同一个那就成死循环了
即会出现Object.__proto__ = F ; F = new Object();
- 而自定义函数默认原型为 F ,即
CustFn.__proto__ === Function.prototype
以此类推他的构造函数就是Function了 即CustFn.constructor === Function
到这里 CustFn 与 其实例的关系也就好理解了,
如
let FC = new CustFn();
CustFn.prototype = FC;
而 var custfn = new CustFn(); 就如 custfn = FC;
所以 custfn.__proto__ === FC
即 custfn.__proto__ === CustFn.prototype
而CustFn.prototype 是 new CustFn();
来的那么 他的constructor 当然是 CustFn了
CustFn.prototype 是通过newCustFn() 这个普通函数来的,所以他的原型是一个{}空对象
CustFn.prototype.__proto__ === {}
到此不难理解 ‘只有new Function()来的函数 的原型才是Function 其的都是普通对象’,如同 new Object()一样
个人能力有限,如理解有误的地方还望指点谢谢
JavaScript原型与原型链深入理解的更多相关文章
- 深入理解JavaScript作用域和作用域链
前言 JavaScript 中有一个被称为作用域(Scope)的特性.虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,本文我会尽我所能用最简单的方式来解释作用域和作用域链,希望大家有所收获! ...
- 【JavaScript】深入理解JavaScript之强大的原型和原型链
由于JavaScript是唯一一个被广泛使用的基于原型继承的语言,所以理解两种继承模式的差异是需要一定时间的,今天我们就来了解一下原型和原型链. AD: hasOwnProperty函数: hasOw ...
- 对Javascript 类、原型链、继承的理解
一.序言 和其他面向对象的语言(如Java)不同,Javascript语言对类的实现和继承的实现没有标准的定义,而是将这些交给了程序员,让程序员更加灵活地(当然刚开始也更加头疼)去定义类,实现继承 ...
- <深入理解JavaScript>学习笔记(5)_强大的原型和原型链
前言 JavaScript 不包含传统的类继承模型,而是使用 prototypal 原型模型. (prototypal :原型.学好英语还是很重要的) 虽然这经常被当作是 JavaScript 的缺点 ...
- 深入理解JavaScript系列(5):强大的原型和原型链
前言 JavaScript 不包含传统的类继承模型,而是使用 prototypal 原型模型. 虽然这经常被当作是 JavaScript 的缺点被提及,其实基于原型的继承模型比传统的类继承还要强大.实 ...
- javascript系列--认识并理解构造函数,原型和原型链
一.前言 介绍构造函数,原型,原型链.比如说经常会被问道:symbol是不是构造函数:constructor属性是否只读:prototype.[[Prototype]]和__proto__的区别:什么 ...
- 如何理解JavaScript的原型和原型链
在现在的业务开发中,应该很少人在写原生JavaScript了,大家都一股脑地扑在各个框架上.本来,这些框架对于业务和开发者来说是一种福音,减少了各种各样的开发痛点,但是带来的负面问题就是对于开发者来说 ...
- javascript原型与原型链个人理解
想了解原型和原型链,我觉得首先我们得知道javascript里有一个Object 与 Function,它俩都是构造函数,当然函数也是一个对象.我们打印Object 与 Function看一下, co ...
- 上帝视角一文理解JavaScript原型和原型链
本文呆鹅原创,原文地址:https://juejin.im/user/307518987058686/posts 前言 本文将从上帝角度讲解JS的世界,在这个过程中,大家就能完全理解JS的原型和原型链 ...
- javascript 原型及原型链的初步理解
最近折腾了好久,终于是把js里面的原型和原型链做了个初步的理解: 在这里,我打个比喻: 我(child),我妈constructor(构造函数)生了我:别人问我老妈跟谁生的我,于是此时我妈会指向我爸爸 ...
随机推荐
- ngix安装与使用
主要是nginx的安装使用, 至于原理 1. 安装nginx(以及两个tomcat) 2. 使用nginx(测试负载均衡) 想要搭建的测试环境, 1.两个tomcat, 端口分别是80和8090(因为 ...
- 基于声网 Flutter SDK 实现多人视频通话
前言 本文是由声网社区的开发者"小猿"撰写的Flutter基础教程系列中的第一篇.本文除了讲述实现多人视频通话的过程,还有一些 Flutter 开发方面的知识点.该系列将基于声网 ...
- Java输入与输出语句详细解析
前言 我们在前面的文章中,学习了如何创建Java文件,也学习了Java里的标识符.运算符.进制等内容.有些同学觉得还不够过瘾,给壹哥发来了好多私信,期待我能够把进度更新的再快一点.这不,新内容这就给大 ...
- C#笔记之泛型
泛型是C#中应用极为广泛的一种语法,本篇文章将详细介绍泛型的定义.使用.性能等. 一.什么是泛型 首先需要记住的是,泛型是.NET 2.0推出的语法,这样的话,泛型基本可以用于所有程序的开发,而不需要 ...
- 浅读-《深入浅出Nodejs》
原书作者:朴灵 https://book.douban.com/subject/25768396/ 这次算是重读 深入浅出Nodejs,了解到很多之前忽略的细节,收获蛮多,这次顺便将其记录分享,对学习 ...
- 每日复习——static , 饿汉式方法,懒汉式方法,以及单例设计模式
1.1.static 的使用 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过 new 关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部 ...
- 12年经验的大龄程序员,都用什么写 API 文档?
写代码,程序员不害怕. 写文档,每个程序员都害怕! 为什么? 技术优先,我们更倾向于将技能和精力更多地放在编写代码上,如果 API 工具不好使,不便捷,同步麻烦,测试看不懂,更会大大地打击编写文档的积 ...
- Python爬取pexels图片
研究Python爬虫,网上很多爬取pexels图片的案例,我下载下来运行没有成功,总量有各种各样的问题. 作为菜鸟初学者,网上的各个案例代码对我还是有不少启发作用,我用搜索引擎+chatGPT逐步对代 ...
- sqlplus文件查看oracle自带命令的执行过程
问题描述:看到一篇文章 在$ORACLE_HOME/bin/sqlplus中可以查看到数据库命令的查询语句.可以直接编辑sqlplus文件,查到到我们平时标准系统命令的原脚本,但是自己进行编辑查看却是 ...
- 【Azure Developer】使用 Microsoft Graph API 获取 AAD User 操作示例
问题描述 查看官方文档" Get a user " , 产生了一个操作示例的想法,在中国区Azure环境中,演示如何获取AAD User信息. 问题解答 使用Microsoft G ...