【JS】类型检测
js 中的类型检测也是很重要的一部分,所以说这篇文章我们就来讲一下怎么对 JavaScript 中的基本数据类型进行检测。其实这也是在读 Zepto 源码中学习到的,所以阅读源码对我们的提升还是很有帮助的。本文基于参考了前辈们的文章之后个人理解此文写的有不当的地方,请各位大佬指正。
其实常规方法主要有四种
typeof
instanceof
Object.prototype.toString
construcor
其实这四种方式归根结底就是两种思路:
根据数据类型判断(1,2)
根据构造函数判断(3,4)
前置基础再看 Zepto 之前看了 慕课网一个老师的视频,一共一个小时左右,开了快进估计也就 45 分钟左右。只是讲了 Zepto 的架构和设计,没有详细的将每一个方法,初看之前可以看一下,对 Zepto 有一个大概的印象。
原型与原型链其实这部分真的是老生常谈的问题,但是每一次听其他人都有新的收获。真的是不想写这部分,但是自我感觉整体思路比较清晰,所以推荐大家阅读一下。
Zepto 整个的设计思想其实是基于 js 的原型链。关于原型链,这个老师讲的比较清晰,需要记住三句话:
每一个函数,都有一个 prototype 属性。
所有通过函数 new 出来的对象,这个对象都有一个 __proto__ 指向这个函数的 prototype。
当你想要使用一个对象(或者一个数组)的某个功能时:如果该对象本身具有这个功能,则直接使用;如果该对象本身没有这个功能,则去 __proto__ 中找。
什么是 prototype(显示原型)每一个函数在创建之后都会拥有一个名为 prototype 的属性,这个属性指向函数的原型对象。通过Function.prototype.bind方法构造出来的函数是个例外,它没有prototype属性。
var fn = function() {} console.log( fn.prototype );通过下面这幅图我们可以看出创建一个函数时,都会有一个 prototype 属性指向它的原型。而 fn.prototype 中有一个 constructor 属性指向 fn 函数。
JavaScript 中任意对象都有一个内置属性 __proto__,隐式原型指向创建这个对象的函数(constructor)的 prototype。
Object.prototype 这个对象是个例外,它的 __proto__ 值为 null
console.log( typeof Array ); // ‘function‘ console.log( Array.prototype );数组构造函数 Array 也是一个函数,并且在 Array 的原型中除了指向 Array 的 constructor 之外还有其他的内置对象。
__proto__ 的指向上面应该都不难理解,主要是 __proto__ 的指向,这个问题是比较难理解的,我们来看刚刚的定义,__proto__ 指向创建这个对象的函数的显式原型。创建函数一共有三种方式:
字面量方式
var person1 = { name: ‘cyl‘, sex: ‘male‘ };字面量的方式是一种为了开发人员更方便创建对象的一个语法糖,本质就是
var o = new Object(); o.xx = xx; o.yy=yy;所以说使用字面量方式创建的函对象的 __proto__ 属性是指向 Object.prototype 的。
构造函数
所谓的构造函数,就是通过 new 关键字调用的函数,只要是通过 new 关键字调用的函数都是构造函数。由构造函数构造的对象,其 __prototype__ 指向其构造函数的 prototype 属性指向的对象。
比如 arr 是一个实例化的数组,那么 arr 的 __proto__ 属性就指向 Array 的 prototype 属性。
函数通过 Object.create 构造的
var person1 = { name: ‘cyl‘, sex: ‘male‘ }; var person2 = Object.create(person1);Object.create 的内部其实是这样的:
function object(o){ function F(){} F.prototype = o; return new F() }也可以看成是通过 new 创建的。所以说我们就可以一目了然,person2 的 __proto__ 是指向 person1 的。(注意,是直接指向 person1,而不是 person1.prototype)。
prototype 和 __proto__ 的作用在了解了什么是显示原型 prototype 和隐式原型 __proto__ 之后,我们也知道了怎么去找隐式原型,那么它们有什么作用呢?
显式原型的作用:用来实现基于原型的继承与属性的共享。
温馨提示: 本文由杰米博客推荐,转载请保留链接: https://www.jmwww.net/file/web/10099.html