首先我们要了解闭包的含义:
闭包即重用变量,又保护变量不被污染的一种机制,
//闭包
var local = ‘变量‘; //局部变量
function arr(){ //arr为函数
console.log(local) //可访问到local变量
}
简单来说:闭包就是:「函数」和「函数内部能访问到的变量」(也叫环境)的总和。
在讲原型链之前先了解什么是原型:
proto 叫做内部原型,prototype 叫做构造器原型
原型:在JavaScript中,一共有两种类型的值,原始值和对象值.每个对象都有一个内部属性[[prototype]],我们通常称之为原型
原型链:
下面附带一张图
工作原理是:当我们有一个构造函数Student , 实例化一个stu对象,当我们需要用到stu中的方法时,就会去proto属性(“父亲”)内去寻找有没有这个方法,从而对象的proto属性指向其构造函数的prototype属性。若在上一层没有找到stu方法,则会继续向“爷爷”辈的属性去找,也就是去Object中去找。
原型链:
1.保存着所有对象的成员(方法和属性)
2.控制对象访问成员的使用顺序,优先使用自己的,自己没有才沿着原型链向父级查找
3.原型链的顶端是Object.prototype
A.验证原型对象:
1.如果一个对象的原型对象是Array.prototype ———— Object.getPrototypeOf(obj) 获得指定obj的原型对象== Array.prototype
例:Object.getPrototypeOf(obj1) == Array.prototype
2.判断father是否是child的父对象 ———— var bool = father.isPrototypeOf(child);
例:Array.prototype.isPrototypeOf(obj1)
B.验证构造函数:
1.如果一个对象的构造函数是Array ———— obj1.constructor == Array
例:obj1.constructor == Array
2.判断obj是否由构造函数Array创建出来 ———— var bool = obj instanceof Array
例:obj1 instanceof Array
C.检查内部属性class
class是每个对象中记录对象创建时适用的类型的属性,就好比人的DNA,一旦对象被创建,class属性就无法被修改
获取class:
Object.protoype中的toString()
例:console.log(obj1.toString())
但是几乎所有内置对象的原型对象都重写Object中String方法,所以内置对象的子对象,都无法直接调用Object的toString
最严格的
通过 call解决 —— 任意对象.任意方法.call(替换的对象)
例:console.log(Object.prototype.toString.call(obj2));
最严格的的鉴别方法:
例:Object.prototype.toString.call(obj1) == "[object Array]",
原文:https://www.cnblogs.com/hzqzwl/p/11331507.html