关于JS原型以及原型链、instanceof的一些理解
一、JS原型
首先要区分两个概念
1、构造函数
2、实例:由构造函数通过new方式创建出来的就是实例
<script>
function Foo() { } var f = new Foo();
console.log(f instanceof Foo);
</script>
比如上面这段代码,f是由new Foo()出来的,那么f称为Foo的实例,Foo也称为f实例的构造函数
1、每一个函数都有一个属性 prototype,这个属性也称该函数的显示原型,prototype是一个空的object对象
2、每一个实例都有一个属性 __proto__,这个属性也称这个实例的原型对象,也称隐式原型
3、实例的原型对象(隐式原型)等于该实例构造函数的显示原型
4、所有通过new Foo()创建出来的实例的__proto__都指向Foo.prototype,所以这些实例的__proto__都是同一个原型对象
这个用上面的代码来说明的话,那就是
<script>
function Foo() { } var f = new Foo();
var k = new Foo(); //f是Foo的实例
console.log(f instanceof Foo); //true //3、实例的原型对象(隐式原型)等于该实例构造函数的显示原型
console.log(f.__proto__ === Foo.prototype);//true //4、所有通过new Foo()创建出来的实例的__proto__都指向Foo.prototype,所以这些实例的__proto__都是同一个对象
console.log(k.__proto__ === f.__proto__);//true
</script>
二、原型链
当试图得到一个实例的某个属性时,如果这个实例本身没有这个属性,那么会去它的_proto_里去找。
如果它的_proto_里没有这个属性,则去它_proto_的_proto_中去找,这样一直往上找,就形成了一个原型链。
<script>
function Foo() {
this.age = 12;
}
Foo.prototype.name = "werben"; var f = new Foo(); //f这个实例本身有age属性,直接读取
console.log(f.age); //output: 12 //f这个实例本身没有name属性,那么会去它的_proto_里去找, 也就是Foo.prototype中去找name
console.log(f.name); //output: werben
</script>
函数本身也是一个实例,是Function这个构造函数的实例,所以函数除了拥有prototype属性之外,它本身也拥有作为实例拥有的__proto__属性。
比如下面的代码,三种定义Foo函数的方式都是等价的。其中一种方式表明Foo也是Function的一个实例
<script>
function Foo() {
console.log('hello world');
}
var Foo = function() {
console.log('hello world');
}
var Foo = new Function(
"console.log('hello world');"
);
</script>
关于JS原型以及原型链、instanceof的一些理解的更多相关文章
- 总结一下js的原型和原型链
最近学习了js的面向对象编程,原型和原型链这块是个难点,理解的不是很透彻,这里搜集了一些这方面的资料,以备复习所用 一. 原型与构造函数 Js所有的函数都有一个prototype属性,这个属性引用了一 ...
- JS对象、原型链
忘记在哪里看到过,有人说鉴别一个人是否 js 入门的标准就是看他有没有理解 js 原型,所以第一篇总结就从这里出发. 对象 JavaScript 是一种基于对象的编程语言,但它与一般面向对象的编程语言 ...
- JS面向对象之原型链
对象的原型链 只要是对象就有原型 原型也是对象 只要是对象就有原型, 并且原型也是对象, 因此只要定义了一个对象, 那么就可以找到他的原型, 如此反复, 就可以构成一个对象的序列, 这个结构就被成 ...
- Js笔记(对象,构造函数,原型,原型链,继承)及一些不熟悉的语法
对象的特性: 1.唯一标识性,即使完全不一样的对象,内存地址也不同,所以他们不相等 2.对象具有状态,同一个对象可能处在不同状态下 3.对象具有行为,即对象的状态可能因为他的行为产生变迁 Js直到es ...
- JS原型、原型链、构造函数、实例与继承
https://cloud.tencent.com/developer/article/1408283 https://cloud.tencent.com/developer/article/1195 ...
- JS(原型和原型链)
(学习自慕课网<前端JavaScript 面试技巧> JS(原型和原型链) 题目1.如何准确判断一个变量是数组类型 使用 instanceof 方法 题目2.写一个原型链继承的例子 实例: ...
- JS基础-该如何理解原型、原型链?
JS的原型.原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对 ...
- 攻略前端面试官(三):JS的原型和原型链
本文在个人主页同步更新~ 背就完事了 介绍:一些知识点相关的面试题和答案 使用姿势:看答案前先尝试回答,看完后把答案收起来检验成果~ 面试官:什么是构造函数 答:构造函数的本质是一个普通函数,他的特点 ...
- JS中的原型链和原型的认识
这篇文章主要是学习一下JavaScript中的难点------原型和原型链 自定义一个对象 我们学习一门编程语言,必然要使用它完成一些特定的功能,而面向对象的语言因为符合人类的认知规律,在这方面做得很 ...
- 一文让你对js的原型与原型链不再害怕、迷惑
目录 原型与原型链的详细剖析 原型 显式原型prototype 隐式原型__proto__ 显式原型prototype与隐式原型__proto__的关系 原型链(隐式原型链) 探寻原型链的尽头 完整详 ...
随机推荐
- docker容器中查看容器linux版本
root@dae5aecea3dd:~# cat /etc/issue Ubuntu LTS \n \l
- Jenkins在H5编译加密过程中一个报错
################################ 背景:开发环境在编译H5的时候出现了以下报错,记录下 ################################ D:\Jenk ...
- springboot+mybatis+druid+sqlite/mysql/oracle
搭建springboot+mybatis+druid+sqlite/mysql/oracle附带测试 1.版本 springboot2.1.6 jdk1.8 2.最简springboot环境 http ...
- JAVA基础知识|枚举
将代码中经常使用的常量,放在枚举中,是一个很好的编码习惯.便于统一修改,同时也增强代码的严谨和稳定性.当然,枚举的应用有很多,这里我只做一个简单的演示,以后看到有趣的使用,会慢慢丰富 package ...
- Ubuntu下制作deb包的方法详解
1 认识deb包 1.1 认识deb包 deb是Unix系统(其实主要是Linux)下的安装包,基于 tar 包,因此本身会记录文件的权限(读/写/可执行)以及所有者/用户组. 由于 Unix ...
- Change Assembly Version in a compiled .NET assembly
Change Assembly Version in a compiled .NET assembly You can use ILMerge: ILMerge.exe Foo.dll /ver:1. ...
- 文件转移 互联网组成 路由器 分组交换 交换机 冲突域 网卡 数据帧的发送与接收会带来CPU开销 CPU中断 双网卡切换
https://zh.wikipedia.org/zh-cn/网段 在以太网环境中,一个网段其实也就是一个冲突域(碰撞域).同一网段中的设备共享(包括通过集线器等设备中转连接)同一物理总线,在这一总线 ...
- 全国数据json
{ "provinces": { "province": [ { "ssqid": "110000", "ss ...
- centos7.4出现yum command not found
购买的云服务器运行yum命令出现yum command not found. 通过将云主机自带的yum和python卸载掉,并且同时需要关注/usr/bin/yum文件的首行解释.我定义其为" ...
- LomBok插件--模型类注解
Data注解,ToString注解都是Lombok提供的注解. Lombok是一个实用的java工具,使用它可以消除java代码的臃肿,Lombok提供一系列的注解,使用这些注解可 以不用定义gett ...