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__.name
foo.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; //wmy
foo.age; //18
foo.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; //wmy
foo.age; //18
foo.sayName(); //wmy
这样就可以成功访问sayName函数了,结合了上述两种方式的优点.
缺点,那就是占用的空间更大了