标签:
我们知道,在OOP语言中可以显式的使一个类继承自另外一个类,这样子类就拥有了父类的属性和方法。比如在PHP中,我们可以这样来继承一个类:
class Person{ //父类 var $name; function say(){ echo "我的名字:".$this->name; } } class Teacher extends Person{ //子类 var $job; function teach(){ echo "我的名字:".$this->name."我的职业:".$this->job; //$this->name继承自父类 } }
在JavaScript没有类的概念,所以引入了原形链的概念。原型链是JS中的主要继承方式,原型链的基本原理是让一个引用类型继承另外一个引用类型的属性和方法。每一个构造函数都会有一个prototype属性指向其原型对象,而该原型对象也会有一个constructor属性指向回构造函数。用构造函数创建出来的实例对象拥有构造函数及其原型的所有属性和方法,并且含有一个内部指针指向构造函数的原型。如果让一个构造函数的原型对象显式地等于另外一个构造函数创建出来的实例,这样这个构造函数及其创建出来的实例对象就会拥有另外一个构造函数及其原型的全部属性和方法了。这样一层层的递进下去,就形成了所谓的原型链。用代码描述如下所示:
function Parent(){ //父级构造函数 this.name = "suliang"; } Parent.prototype.say = function(){ console.log("我的名字:"+this.name); } function Child(){ //子级构造函数 this.job = "软件工程师"; } Child.prototype = new Parent(); //继承父级全部属性和方法 Child.prototype.talk = function(){ console.log("我的名字:"+this.name+"我的职业:"+this.job); }
以上代码使得构造函数Child继承了Parent的全部属性和方法,但是因为改变了Child的prototype,所以会导致Child.prototype和person1的Constructor也被修改为指向了构造函数Parent,如果有必要的话,可以将其显式地修改为指向构造函数Child。我们在调用person1.talk()的时候,实际上进行了以下三步操作:1,查找实例对象有没有方法talk(),2,查找Child.prototype看有没有talk()方法,3,查找Parent.prototype看有没有talk()方法。
标签:
原文地址:http://www.cnblogs.com/suliang1100/p/4562647.html