javascript instanceof 问题

PYPlus 发布于 2013/01/12 16:24
阅读 494
收藏 0

刚开始学习javascript   ,instanceof这个问题困扰我很久了 下面的代码来自互联网

function Cat(){}
Cat.prototype = {}
 
function Dog(){}
Dog.prototype ={}
 
var dog1 = new Dog();
alert(dog1 instanceof Dog);//true
alert(dog1 instanceof Object);//true
 
Dog.prototype = Cat.prototype;
alert(dog1 instanceof Dog);//false
alert(dog1 instanceof Cat);//false
alert(dog1 instanceof Object);//true;
倒数第二行代码结果为什么是false?  下面是我的分析:

构造函数Dog()有一个prototype指针指向原型函数 原型函数同时有一个constructor指回Dog  

var dog1 = new Dog();
上面的代码, 实例dog1 内部有一个[[prototype]]指针也指向了Dog的原型函数即跟Dog.prototype指向同个地方

现在执行了下面的代码之后

Dog.prototype = Cat.prototype;
构造函数Dog()的prototype被改写为指向Cat的原型函数 那此时dog1的[[prototype]]是不是也指向了Cat.prototype?

如果是的话 Cat的原型函数不就在dog1的原型链上了?那倒数第二句dog1 instanceof Cat 应该是true而不是false啊


加载中
0
xesam
xesam

首先instanceof只有在实例和类都找到相同的prototype才会返回true

Dog.prototype ={}和Dog.prototype = Cat.prototype;因为你使用的是赋值,就切断了联系。

给你举个例子:

function Cat(){}
 
function Dog(){}
var dog1 = new Dog();
console.dir(dog1.__proto__ == Dog.prototype);//true
Dog.prototype ={}
console.dir(dog1.__proto__ == Dog.prototype);//false
var dog2 = new Dog();
console.dir(dog2.__proto__ == Dog.prototype);//true
Dog.prototype = Cat.prototype;
console.dir(dog2.__proto__ == Dog.prototype);//false
var dog3 = new Dog();
console.dir(dog3.__proto__ == Dog.prototype);//true
console.dir(dog3.__proto__ == Cat.prototype);//true
就和
A.prototype = {}
B.prototype = A.prototype
A.prototype = {} 

但是A.prototype 和 B.prototype不相同一样

PYPlus
PYPlus
"instanceof只有在实例和类都找到相同的prototype才会返回true"用这个判断确实很好判断,我早先用原型链解释 结果把自己搞晕了 现在应该是懂了 谢谢 ^_^
0
Arrowing
Arrowing

1、本来dog1有一个原型指针[[prototype]]指向Dog的原型对象

2、这时候dog1的原型对象有个constructor属性也指向Dog的原型对象

有以上两点的话,那么dog1 instanceof Dog 肯定为true

这时候Dog的原型对象被赋值更改了,也就是切断了dog1与Dog之间的联系

那么dog1与Dog应该是没有关系的了。。。不知道对不对 :)

PYPlus
PYPlus
我搞懂了 ,谢谢回答 ^_^
返回顶部
顶部