原型和原型链
原型:
我们创建的每个函数都有一个prototype(原型)属性,这个属性是个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。如果按照字面意思来理解,那么prototype就是通过调用构造函数而创建的那个对象实例的原型对象使用原型的好处是可以让所有对象实例共享它所包含的属性和方法。换句话说,不必在构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中,如下面的例子所示:
function Person(){
}
person.prototype.name="me";
person.prototype.age=18;
person.prototype.job="student";
person.prototype.sayName=function(){
alert(this.name);
};
var person1=new Person();
person1.sayName();//me
var person2=new Person();
person2.sayName();//me
alert(person1.sayName==person2.sayName);//true
在此,我们将sayName()方法和所有属性直接添加到了person的prototype属性中,构造函数变成了空函数。即使如此,也仍然可以通过调用构造函数来创建新对象,而且新对象还会具有相同的属性和方法。
原型链
ECMAScript中描述了原型链的概念,并将原型链作为实现继承的主要方法。其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。简单回顾一下构造函数,原型和实例的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型的对象的内部指针。那么假如我们让原型对象等于另一个类型的实例,结果会怎样呢?显然,此时的原型对象将包含一个指向另一个原型的指针,相应的另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立,如此层层递进,就构成了实例与原型的链条。这就是所谓的原型链。
实现原型链的基本模式如下:
function superType(){
this.property=true;
}
SuperType.prototype.getSuperValue=function(){
return this.property;
};
function SubType(){
this.subProperty=false;
}
//继承了SuperType
SubType.prototype=new SuperType();
SubType.prototype.getSubValue=function(){
return this.Subproperty;
};
var instance = new SubType();
alert(instance.getSuperValue());
以上代码定义了两个类型:super和person。每个类型分别有一个属性和方法。他们的区别是person继承了super,而继承是通过创建super的实例。将该实例赋给person.prototype实现的。super.Prototype中的所有属性和方法也存在于person.prototype中了。
原型:
我们创建的每个函数都有一个prototype(原型)属性,这个属性是个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。如果按照字面意思来理解,那么prototype就是通过调用构造函数而创建的那个对象实例的原型对象使用原型的好处是可以让所有对象实例共享它所包含的属性和方法。换句话说,不必在构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中,如下面的例子所示:
function Person(){
}
person.prototype.name="me";
person.prototype.age=18;
person.prototype.job="student";
person.prototype.sayName=function(){
alert(this.name);
};
var person1=new Person();
person1.sayName();//me
var person2=new Person();
person2.sayName();//me
alert(person1.sayName==person2.sayName);//true
在此,我们将sayName()方法和所有属性直接添加到了person的prototype属性中,构造函数变成了空函数。即使如此,也仍然可以通过调用构造函数来创建新对象,而且新对象还会具有相同的属性和方法。
原型链
ECMAScript中描述了原型链的概念,并将原型链作为实现继承的主要方法。其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。简单回顾一下构造函数,原型和实例的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型的对象的内部指针。那么假如我们让原型对象等于另一个类型的实例,结果会怎样呢?显然,此时的原型对象将包含一个指向另一个原型的指针,相应的另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立,如此层层递进,就构成了实例与原型的链条。这就是所谓的原型链。
实现原型链的基本模式如下:
function superType(){
this.property=true;
}
SuperType.prototype.getSuperValue=function(){
return this.property;
};
function SubType(){
this.subProperty=false;
}
//继承了SuperType
SubType.prototype=new SuperType();
SubType.prototype.getSubValue=function(){
return this.Subproperty;
};
var instance = new SubType();
alert(instance.getSuperValue());
以上代码定义了两个类型:super和person。每个类型分别有一个属性和方法。他们的区别是person继承了super,而继承是通过创建super的实例。将该实例赋给person.prototype实现的。super.Prototype中的所有属性和方法也存在于person.prototype中了。