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(构造函数)生了我:别人问我老妈跟谁生的我,于是此时我妈会指向我爸爸 ...
随机推荐
- 论文翻译:2023_THLNet: two-stage heterogeneous lightweight network for monaural speech enhancement
论文地址:THLNet: 用于单耳语音增强的两级异构轻量级网络 代码:https://github.com/dangf15/THLNet 引用格式:Dang F, Hu Q, Zhang P. THL ...
- Golang数据结构
数据类型 不同类型的内存样式图 append,切片添加元素 清空切片的3种方法 清空切片的2种方法 查看变量类型 使用 fmt.Printf package main import "fmt ...
- vue之字符串的方法
目录 简介 indexOf方法 简介 本文会把遇到的字符串的方法慢慢补充进来 indexOf方法 indexOf方法判断字符串是否包含另一个字符串 判断结果如果包含返回的是索引,如果不包含,则返回-1 ...
- [数据库/Java]数据库开发过程中产生的MySQL错误代码及其解决方案
前言 吐槽一下,均是这两天遇到的破烂事儿,搞定了也好,以后出现此类问题也就放心些了. 下列遇到的问题大都是因为MySQL从5.x版本升级到8.0.11(MySQL8.0涉及重大改版)后,跟着连带着出现 ...
- [Java]排序算法>插入排序>【折半插入排序】(O(N*N)/稳定/N较大/无序/顺序存储)
1 折半插入排序 1.1 算法思想 相比于[直接插入排序]:采用"顺序查找法"查找当前记录在已排好序的序列中的插入位置, 折半插入排序利用"折半查找法"快速查出 ...
- stable diffusion打造自己专属的LORA模型
通过Lora小模型可以控制很多特定场景的内容生成. 但是那些模型是别人训练好的,你肯定很好奇,我也想训练一个自己的专属模型(也叫炼丹-_-). 甚至可以训练一个专属家庭版的模型(family mode ...
- Burp Suite最新版本专业版激活2022.12.1附原文件
Burp Suite 攻击web 应用程序的集成平台 Burp Suite 是用于攻击web 应用程序的集成平台,包含了许多工具.Burp Suite为这些工具设计了许多接口,以加快攻击应用程序的过程 ...
- 从0到1手把手教你ASP.NET Core Web API项目配置接口文档Swagger(一)
一.创建ASP.NET Core Web API项目(若项目已创建,则可跳过本节内容) 1.双击打开VS2022. 2.单击"创建新项目",如下图. 3.选择"ASP.N ...
- DG:三种模式切换
应用归档日志方式进行数据同步 SQL> alter system set log_archive_dest_2='SERVICE=standby arch noaffirm valid_for= ...
- C# 从0到实战 命名空间
什么是命名空间 命名空间是C#为了解决类名冲突而产生的一种方案,通过特定的前缀来标识一个类,使得编程者可以在自己的命名空间中自由使用各种类名,这很类似于Java中的包. 一般新手学习C#都会使用一个 ...