原型继承、构造函数继承

来源:互联网 发布:手机淘宝昵称怎么修改 编辑:程序博客网 时间:2024/05/18 00:17

JavaScript的继承

function A(name){    this.name = name;}A.prototype.sayName = function(){    console.log(this.name);}function B(age){    this.age = age;}

原型继承

B.prototype = new A("mbj");// 被B的实例共享var foo = new B(18);foo.age;//18,age是本身携带的属性foo.name;   //mbj,等价于foo.__proto__.namefoo.sayName(); //mbj,等价于foo.__proto__.proto__.sayName()foo.toString();  //"[object Object]",等价于foo.__proto__.__proto__.__proto__.toString();

这样B通过原型继承了A,在new B的时候,
foo中有个隐藏的属性proto指向构造函数的prototype对象,在这里是A对象实例,
A对象里面也有一个隐藏的属性proto,指向A构造函数的prototype对象,这个对象里面又有一个proto指向Object的prototype

第一个缺点是所有子类共享父类实例,如果某一个子类修改了父类,其他的子类在继承的时候,会造成意想不到的后果。

第二个缺点是在构造子类实例的时候,不能给父类传递参数。

构造函数继承

function B(age,name){  this.age=age;A.call(this,name); }var foo=new B(18,"wmy");foo.name;     //wmyfoo.age;      //18foo.sayName();   //undefined

采用这种方式继承是把A中的属性加到this上面,这样name相当于就是B的属性,sayName不在A的构造函数中,所以访问不到sayName。

缺点是父类的prototype中的函数不能复用。

原型继承+构造函数继承

function B(age,name){  this.age=age;A.call(this,name); }B.prototype=new A("mbj");var foo=new B(18,"wmy");foo.name;     //wmyfoo.age;      //18foo.sayName();   //wmy

这样就可以成功访问sayName函数了,结合了上述两种方式的优点.

缺点,那就是占用的空间更大了

0 0