Js面向对象随笔(1)

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



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值