JS类型判断&原型链
JS类型检测主要有四种
- 1、typeof Obj
- 2、L instanceof R
- 3、Object.prototype.toString.call/apply();
- 4、Obj.constructor
Remark前两种是数据类型检查方式,后两种是构造函数判断
首先了解下显式原型prototype
- 每一个函数(fn)在创建之后都有一个prototype, 且指向函数的原型对象, 原型对象中的constructor属性又指向fn;
fun = function () {};
fun.prototype// 函数包含prototype指向它的原型对象 且 fun.prototype.constructor又指向fun函数
其次了解下隐式原型__proto__
- JS中任意一个构建的对象都有__proto__, __proto__指向创建这个对象的constructor函数的prototype;
- Array.proto => undefined;
- Object.proto => null;
// 1、字面量方式创建star
let testObj = {a: 1};
// 实际进行了以下步骤
let textObj = new Object();
textObj.a = 1;// 此时textObj有了__proto__,且__proto__指向Object.prototype
// 同理 字面量创建一个数组
let testArr = [];
testArr = new Array();
// 1、字面量方式创建end
// 2、通过Object.create()构造 star
const Obj = {a: 1};
const copyObj = Object.create(Obj);
// 内部是这样的
function create(o) {
function copy() {};
copy.prototype = o; // **Remark此时Object.create创建的对象copyObj.__proto__直接指向Obj而不是Obj.prototype**
return new copy(); // create也是new一个
}
// 2、通过Object.create()构造 end
- 都是new一个实例对象
显式原型prototype的作用
- 用来实现基于原型的继承和属性共享
隐式原形的作用
- 构成原型链, 同样用于基于原型的继承, example: 当我们访问obj.a属性时, 如果obj找不到,那么会沿着__proto__依次寻找;(敲黑板: 重点是依次寻找);
- 重写__proto__
const arr = [];
arr.__proto__.unPush = obj => console.log(obj);
arr.push(1); // arr本身没有push(),但是它会从隐形原型上__proto__依次查找, 找到Array.prototype上有该方法所以可以使用
arr.unPush(2); // 2
typeof
- 缺陷有两点
- 只能判断基本数据类型除了null,不能判断引用数据类型(判断都为Object);
- typeof 1 => 'Number';
- typeof {} => 'Object';
- typeof null => 'Object';
- typeof undefined => 'undefined'
L instanceof R 判断变量是否在某一个instanceof上("实例"上)
- 判断左边的隐式原型是否在右边的显式原型上, 不是的话依次往上找直到为null为止; (new 操作符的反向查找)
function instance_of(L, R) {
L.__proto__ === R.prototype ? true : instance_of(L.__proto__, R);
// 一直从隐式原型链上查找
}
- 只能判断引用数据类型
- 右边只能是构造函数或者对象, 不然会抛出TypeError错误
Object.prototype.toString.call/apply();最完美的检测方法, 检测所有类型
- 实现过程????!!!
constructor
- Obj.constructor === Number/Array/Object/Function/String/Boolean
- 字面量或者构造函数都能检测example: new Number()
- 不能判断null和undefined
isArray(); isNaN();
//原文链接 https://blog.csdn.net/sunshine940326/article/details/77944768
JS类型判断&原型链的更多相关文章
- js 类型系统的核心:元类型、原型链与内省机制
js 类型系统的核心:元类型.原型链与内省机制 二.JS数据类型 下面就来看看JS中的数据类型,在js中定义了如下几种数据类型:大方向上分为 基本数据类型(简单数据类型) 和 引用数据类型(复杂数据类 ...
- JS对象、原型链
忘记在哪里看到过,有人说鉴别一个人是否 js 入门的标准就是看他有没有理解 js 原型,所以第一篇总结就从这里出发. 对象 JavaScript 是一种基于对象的编程语言,但它与一般面向对象的编程语言 ...
- JS面向对象之原型链
对象的原型链 只要是对象就有原型 原型也是对象 只要是对象就有原型, 并且原型也是对象, 因此只要定义了一个对象, 那么就可以找到他的原型, 如此反复, 就可以构成一个对象的序列, 这个结构就被成 ...
- 类型和原生函数及类型转换(二:终结js类型判断)
typeof instanceof isArray() Object.prototype.toString.call() DOM对象与DOM集合对象的类型判断 一.typeof typeof是一个一元 ...
- 深入理解JS对象和原型链
函数在整个js中是最复杂也是最重要的知识 一个函数中存在多面性: 1.它本身就是一个普通的函数,执行的时候形成的私有作用域(闭包),形参赋值,预解释,代码执行,执行完 成后栈内存销毁/不销毁. 2.& ...
- JS类型判断typeof PK {}.toString.call(obj)
参考链接:https://www.talkingcoder.com/article/6333557442705696719 先看typeof <!doctype html> <htm ...
- js类型判断:typeof与instanceof
typeof用以获取一个变量或者表达式的类型,typeof一般只能返回如下几个结果: number,boolean,string,function(函数),object(NULL,数组,对象),und ...
- js类型判断及鸭式辨型
目录 instanceof constructor 构造函数名字 鸭式辨型 三种检测对象的类方式: instanceof.constructor .构造函数名字 用法如下: 1)instanceof ...
- JS中的原型链和原型的认识
这篇文章主要是学习一下JavaScript中的难点------原型和原型链 自定义一个对象 我们学习一门编程语言,必然要使用它完成一些特定的功能,而面向对象的语言因为符合人类的认知规律,在这方面做得很 ...
随机推荐
- Java基础(十一)——反射
一.概述 1.介绍 Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法. 加载完类 ...
- 微信h5下拉隐藏网页,还有取消页面滑动
需求: 网页下拉太丑了,如下 度娘了一下, 发现一篇相关文档 基本解决了问题 https://juejin.cn/post/6844903940190896135#heading-2 加入如下代码即可 ...
- Android利用zxing生成二维码
感谢大佬:https://blog.csdn.net/mountain_hua/article/details/80646089 **gayhub上的zxing可用于生成二维码,识别二维码 gayhu ...
- mysql导出csv格式命令
mysql -h 127.0.0.1 -u user -p123456 -Bse "select name,age from user where age > 10;" | ...
- Java线程--Callable使用
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871727.html Java线程--Callable使用 Callable和Runnabl ...
- iOS中JavaScript和OC交互 --by 胡 xu
在iOS开发中很多时候我们会和UIWebView打交道,目前国内的很多应用都采用了UIWebView的混合编程技术,最常见的是微信公众号的内容页面.前段时间在做微信公众平台相关的开发,发现很多应用场景 ...
- 数据分析实际案例之:pandas在餐厅评分数据中的使用
目录 简介 餐厅评分数据简介 分析评分数据 简介 为了更好的熟练掌握pandas在实际数据分析中的应用,今天我们再介绍一下怎么使用pandas做美国餐厅评分数据的分析. 餐厅评分数据简介 数据的来源是 ...
- 数字化转型——医院数字化管理平台HDMP建设历程
最近几年一直在做医疗行业的B端应用,在搭建医院数字化转型管理平台的过程中累积了一些知识,准备抽时间不断的把整个平台搭建过程及思想记录下来,帮助自己记忆,也希望对相应知识点有需要的伙伴能有一个启发. ...
- PentestBOX教程
0x01 Pentest BOX Pentest Box:渗透测试盒子,是一款Windows平台下预配置的便携式开源渗透测试环境,而它也是著名黑客Kapustkiy常用的工具之一.这里集成的大都是Li ...
- 【windows 操作系统】文件保护:文件访问类型和访问控制
文件保护:文件访问类型和访问控制 为了防止文件共享可能会导致文件被破坏或未经核准的用户修改文件,文件系统必须控制用户对文件的存取,即解决对文件的读.写.执行的许可问题. 为此,必须在文件系统中建立相应 ...