Js面向对象随笔(1)

来源:互联网 发布:mysql经典入门书籍 编辑:程序博客网 时间:2024/06/14 00:43

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.prototypeo 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;//truenew Date() instanceof Date;//truefunction Person(){};new Person() instanceof Person;//true[] instanceof Object; //truenew Date() instanceof Object;//truenew 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



1 0
原创粉丝点击