Javascript原型链和继承

原型链图

实例化的对象拥有独立的一套属性和方法,举例如下:

function Person(name){

        this. name=name;

        this. getName=function(){

                return this. name;

        }

}

var p1=new Person("tom");

var p2=new Person("alice");

实例化的对象p1和p2拥有各自的name属性和getName方法,尽管这两个方法实现的功能一致。

function Person(name){

        this. name=name;

}

Person.prototype. getName=function(){

        return this. name;

}

var p3=new Person("tom");

var p4=new Person("alice");

把getName方法定义到Person. prototype原型上,p3和p4拥有各自的属性name,同时共享相同的getName方法。

同样的,若把属性定义到原型上,如Person. prototype. count=520; 则所有实例化的Person对象都可以访问人类数量,若新增一个实例修改count为521,所有的实例访问count时都显示521。

访问一个对象的属性和方法时,系统会沿着原型链去寻找,先在对象的数据结构中找,若没有找到就到其原型对象中找,若还没找到,就到其原型对象的上一层原型对象去找,这就是继承。如图,Person原型对象的__proto__指向它的父类Object的原型对象。

于是修改一个类Person原型对象的上一层原型对象为另外一个类Living原型对象,就实现了Person继承Living的目的。

Person. prototype.__proto__=Living. prototype;

如果Person原型对象中没有属性和方法,则直接将Person的原型对象改成Living的原型对象,也是可以的。

Person. prototype=Living. prototype;

同时更正原型对象的构造函数指向Person. prototype. constructor=Person;

这样Living就成为Person的父类,也就是说Person继承了Living。

你可能感兴趣的:(Javascript原型链和继承)