1.1 原型链的内部属性
1.1.1.Prototype
Prototype属性表示该类的父类的原型对象,一般可以用属性_proto_来访问(IE不支持)。
1.1.2.Class
Class属性表示类名,是一个字符串。
例如:
Object类:
{
Prototype:null,
Class:"Object"
}
因为Object类为跟类,他没有父类,所以Prototype属性为空。
其他类js类如果没有继承其他js类它的Prototype属性应该为Object原型对象。
1.2 prototype的作用——原型链的实现
1.2.1.实现继承
function Person(){}
function Student(){}
他们的内部属性定义为:
Person: {
Prototype:Object的原型对象,
Class:"Person"
}
Student: {
Prototype:Object的原型对象,
Class:"Student"
}
现在使 Student.prototype = new Person();
Student: {
Prototype:Person的原型对象,
Class:"Student"
}
这样就实现了继承。
1.2.2 分享属性和方法
在创建一个类的实例时,该实例隐式地包含有对自身原型对象的引用。因此,实例中也包含内部属性Prototype的定义。
function Person {
this.name = "";
this.age = 0;
}
function Man {
this.length = 0
}
function Student {
this.level = ""
}
Man.prototype = new Person();
Student.prototype = new Man();
那么在实例化Person时,这个实例隐式地包含有自身内部属性Prototype的值,该值包含有Person类属性的描述;同样的,在实例化Man时,这个实例也包含内部属性Prototype的值,值也包含Man的属性描述;同样,Student类也一样。
如果Student的实例调用一个属性,那么它会按照下面的步骤:
1.在Student中查找这个属性,若存在,则返回,否则查找Protoype属性值,查到是Man的实例。
2.在Man中查找这个属性,若存在,则返回,否则查找Protoype属性值,查到是Person的实例。
3.在Person中查找这个属性,若存在,则返回,否则查找Protoype属性值,查到是Object的实例。
4.在Object中查找这个属性,若存在,则返回,否则返回undefined。