在javascript里,每个function都有一个prototype属性,这个属性的用途是实现继承机制。必如下面定义的function class1:
function class1(){}
class1.prototype = {a:10,b:100};
则class1的每个实例都会从prototype继承a和b这两个属性。
同时,每个对象都会有一个内部的属性_proto_(不同的javascript虚拟机实现用的名字可能不同),这个属性对js开发人员不可见,只在虚拟机内部使用。每当创建一个对象的时候,这个对象的_proto_就会被赋值为这个对象的构造函数的prototype,这样对象的_proto_属性和构造函数的prototype引用相同的对象,并且一旦对象创建完成,_proto_属性就不会改变。 这样通过对象的_proto_属性,以及_proto_所引用的对象的_proto_属性,就构成了一个_proto_链。 当访问一个对象的属性和方法的时候,js虚拟机正是通过这个_proto_链来查找的。
![](/Images/OutliningIndicators/ContractedBlock.gif)
Code
javascript中instanceof是如何工作的
javascript中判断一个对象是不是一个类的实例时,经常是obj instanceof class
比如:
function class1(){};
function class2(){};
class2.prototype=new class1();
function class3(){};
class3.prototype=new class2();
function class4(){};
var obj=new class3();
alert(obj instanceof class3);//true
alert(obj instanceof class2);//true
alert(obj instanceof class1);//true
但是有想过解释器是如何判断一个对象是否是一个类的实例吗?网上大多是说通过原型链来判断。
上面可能看到有一个类class4没被用到过,那在后面添上这句
class2.prototype=new class4();
alert(obj instanceof class3);//true;
alert(obj instanceof class2);//false;
alert(obj instanceof class1);//true;//
在javascript里,每个function都有一个prototype属性,这个属性的用途是实现继承机制。必如下面定义的function class1:
function class1(){}
class1.prototype = {a:10,b:100};
则class1的每个实例都会从prototype继承a和b这两个属性。
同时,每个对象都会有一个内部的属性_proto_(不同的javascript虚拟机实现用的名字可能不同),这个属性对js开发人员不可见,只在虚拟机内部使用。每当创建一个对象的时候,这个对象的_proto_就会被赋值为这个对象的构造函数的prototype,这样对象的_proto_属性和构造函数的prototype引用相同的对象,并且一旦对象创建完成,_proto_属性就不会改变。 这样通过对象的_proto_属性,以及_proto_所引用的对象的_proto_属性,就构成了一个_proto_链。 当访问一个对象的属性和方法的时候,js虚拟机正是通过这个_proto_链来查找的。
关于instanceof:
假设有一条这样的语句:
o instanceof c;
在上面的语句执行过程中,虚拟机会把c.prototype和o的_proto_链上的节点逐个进行比较,如果找到相等的节点,则返回true,否则返回false。