javascript原型与原型链个人理解
想了解原型和原型链,我觉得首先我们得知道javascript里有一个Object 与 Function,它俩都是构造函数,当然函数也是一个对象。我们打印Object 与 Function看一下,
console.log(Function) console.log(Object)
那么这个Object 与 Function 之间有何关系与区别呢?首先您只需要记住:
1. 所有普通对象都是 Object 的实例(也就是说Object是所有普通对象的爸爸);
2. 所有普通函数都是 Function 的实例(也就是说Function是所有普通函数的爸爸);
3. Function是 Object 的实例;(Object是所有对象的爸爸)
构造函数与原型对象的区别:
Object是构造函数,而Object.prototype是构造函数的原型对象。构造函数自身的属性和方法无法被共享,而原型对象的属性和方法可以被所有实例对象所共享。
其次,constructor属性是原型对象上的一个属性,可以被所有实例对象所共享。要注意的是,prototype是构造函数的属性,而constructor则是构造函数的prototype属性所指向的那个对象,也就是原型对象的属性。由于constructor属性是一种原型对象和构造函数的关系,所以在修改原型对象的时候,一定要注意constructor的指向问题。
接下来我们说重点,javascript里的__proto__ 和 prototype 属性。
1. 所有的对象都有__proto__ 属性,可通过__proto__属性来访问这个对象的原型,而 __proto__ 指向的是它原型对象的prototype 属性(对象没有prototype属性);
2. 所有的构造函数都有一个prototype 和 __proto__ 属性,而该函数的prototype属性指向的是它原型对象上的constructor属性。
代码实例:
var A = function () {} // 申明一个函数对象A; var B = new A(); // 为A创建一个实例B; console.log("A.prototype:", A.prototype); console.log("B.__proto__:", B.__proto__); console.log(A.prototype === B.__proto__);
Prototype 的作用:
可以为原型的实例设置公用的属性或方法;
var A = function () { this.ary1 = []; } var B = new A(); var C = new A(); B.ary1.push(1); C.ary1.push(2);
console.log(B.ary1) console.log(C.ary1)
A.prototype.ary2 = []; B.ary2.push(1); C.ary2.push(2); console.log(B.ary2);
最后总结下什么是原型链:
所有的对象都有一个__proto__属性,我们通过对象的__proto__属性一层层的向上访问,最终会得到值null;那么我们访问的整个路径就是这个对象的原型链。
(感觉个人理解还是不够深刻,这里只是记录一下自己目前对于原型链的理解,多多指教!)
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原型和原型链
本文呆鹅原创,原文地址:https://juejin.im/user/307518987058686/posts 前言 本文将从上帝角度讲解JS的世界,在这个过程中,大家就能完全理解JS的原型和原型链 ...
- javascript 原型及原型链的初步理解
最近折腾了好久,终于是把js里面的原型和原型链做了个初步的理解: 在这里,我打个比喻: 我(child),我妈constructor(构造函数)生了我:别人问我老妈跟谁生的我,于是此时我妈会指向我爸爸 ...
随机推荐
- ThreadPoolExecutor 优雅关闭线程池的原理.md
经典关闭线程池代码 ExecutorService executorService = Executors.newFixedThreadPool(10); executorService.shutdo ...
- jdbc元数据
l 在jdbc中获取数据库的定义,例如:数据库.表.列的定义信息.就用到元数据. l 在jdbc中可以使用: 数据库元数据.参数元数据.结果集元数据 l (元数据定义相关api, ..Meta ...
- 使用sql developer 导出Oracle数据库中的表结构
MS SQLServer的客户端工具做的的确比较好,直接右键,导出数据库就OK了,而且MS的客户端导出的是xxx.dbf文件,直接附加到别的数据库上就OK了 Oracle的sql developer就 ...
- 阶段3 3.SpringMVC·_06.异常处理及拦截器_4 SpringMVC拦截器之介绍和搭建环境
拦截器可以有多个 搭建环境 不用改,直接finish 复制原来项目的 依赖的包也复制过来 web.xml配置前端控制器 springmvc的配置文件 先创建对应的文件夹 分别创建java和resour ...
- Redis 持久化配置(兼论瞎翻译的问题)
redis.conf 文件中配置 save 默认配置项: save save save 查了好几个地方都是这么说的: 第一句的意思:15分钟内修改了一个键就保存??? 往 Redis 里加了一个值,重 ...
- jmeter beanShell修改http请求参数
jmeter beanShell修改http请求参数 在使用jmeter进行测试时,需要对上一步响应的明文参数,如userName='tom' token='%sdf%sdkdfj'之类的参数,加密一 ...
- IntelliJ IDEA 设置检查 serialVersionUID
IntelliJ IDEA 设置检查 serialVersionUID 背景介绍 我们在使用IntelliJ IDEA创建Java类的时候,有时候需要实现序列化接口 implements Serial ...
- golang(06)函数介绍
原文链接 http://www.limerence2017.com/2019/09/11/golang11/#more 函数简介 函数是编程语言中不可缺少的部分,在golang这门语言中函数是一等公民 ...
- H3C 模拟器 防火墙开启Web功能
最近在搞运维的一些事情,由于缺少实体的机器来进行操作,先在模拟器里面进行 环境 windows 10,模拟器 HCL_V2.1.1 防火墙 1 在windows添加虚拟网卡 我的电脑--管理--设备管 ...
- 有关face的好文MARK集
Single Stage Headless Face Detector 据说已经超过了tiny face DDFD <Multi-view Face Detection Using Deep C ...