1、对象的概念:在ECMAScript-262中,对象被定义为“无序属性的集合,其属性可以包含基本值,对象或者函数,那么在JavaScript中,对象也无非就是由一些无序的Key-Value对组成,其中Value可以是基本值,对象或者函数”。
2、我们常用Object.prototype.toString.call()这个方法判断对象的具体类型,当然还有instanceof方法(关于这个方法下面有具体说明)以及typeof(typeof 可以对JS基础数据类型做出准确的判断,但对象引用类型的数据基本返回都是object)方法可以判断,但都不怎么准确,这我们试试就知道了
2.1 object instanceof constructor实际用来测试一个对象在其原型链中是否存在一个构造函数的 prototype
属性。(这里初学者可能会迷惑到底什么是原型链,原型链是由于所有对象都有原型,而原型本身也是对象,所以原型也可能有原型,这样就构成了所谓的原型链。原型链终止于链中原型为 null 的对象,而当你new Object()时,实际上创建了一个原型为 Object.prototype
的对象,而该原型自身则拥有一个值为 null 的原型。)也就是instanceof
运算符用来检测 constructor.prototype
是否存在于参数 object
的原型链上。用代码可能更容易理解:
// 定义构造函数
function C(){}
function D(){}
var o = new C();
// true,因为 Object.getPrototypeOf(o) === C.prototype
o instanceof C;
// false,因为 D.prototype不在o的原型链上
o instanceof D;
具体的,A instanceof B是用来判断 A 是否为 B 的实例对,表达式为:A instanceof B,如果A是B的实例,则返回true,否则返回false。 在这里需要特别注意的是:instanceof检测的是原型,我们用一段伪代码来模拟其内部执行过程:
instanceof (A,B) = {
var L = A.__proto__;
var R = B.prototype;
if(L = = = R) {
//A的内部属性__proto__指向B的原型对象
return true;
}
return false;
}
当 A 的 __proto__ 指向 B 的 prototype 时,就认为A就是B的实例,再看几个例子:
[] instanceof Array; //true
{} instanceof Object;//true
new Date() instanceof Date;//true
function Person(){};
new Person() instanceof Person;//true
[] instanceof Object; //true
new Date() instanceof Object;//true
new Person instanceof Object;//true
虽然 instanceof 能够判断出 [] 是Array的实例,但它认为 [] 也是Object的实例,为什么呢? 我们来分析一下[]、Array、Object 三者之间的关系: 从instanceof 能够判断出 [].__proto__ 指向 Array.prototype, 而 Array.prototype.__proto__ 又指向了Object.prototype,Object.prototype.__proto__ 指向了null,标志着原型链的结束。从原型链可以看出,[] 的 __proto__ 直接指向Array.prototype, 间接指向Object.prototype, 所以按照 instanceof 的判断规则,[] 就是Object的实例。当然,类似的new Date()、new Person() 也会形成这样一条原型链,因此,instanceof 只能用来判断两个对象是否属于原型链的关系, 而不能获取对象的具体类型。通常来讲,使用instanceof 就是判断一个实例是否属于某种类型,更重的一点是 instanceof 可以在继承关系中用来判断一个实例是否属于它的父类型。例如:
// 判断 foo 是否是 Foo 类的实例 , 并且是否是其父类型的实例function Aoo(){}
function Foo(){}
Foo.prototype = new Aoo();//JavaScript 原型继承
var foo = new Foo();
console.log(foo instanceof Foo)//true
console.log(foo instanceof Aoo)//true