javascript最常用的继承模式——代码如下:
function SuperType(name) {
this.name = name;
this.colors = ["red","black"];
}
SuperType.prototype.sayName = function() {
alert(this.name);
};
function SubType(name, age) {
//继承属性
SuperType.call(this,name)
this.age = age;
}
//继承方法
SubType.prototype = new SuperType();
SubType.prototype.sayAge = function() {
alert(this.age);
}
var instance1 = new SubType("sgoddon",21);
instance1.colors.push("green");
alert(instance1.colors); //"red,black,green"
instance1.sayName(); //"sgoddon"
instance1.sayAge(); //21
var instance2 = new SubType("Nick",18);
alert(instance2.colors); //"red,black"
instance2.sayName(); //"Nick"
instance2.sayAge(); //18
属性(name和colors)在SuperType构造函数 中定义,方法sayName()在SuperType的原型中定义。
subType构造函数在调用SuperType构造函数时传入了name参数,紧接着又定义了它自己的属性age。然后SuperType是实例赋值给SubType的原型,然后又在新原型上定义了方法sayAge()。这样一来,两个不同的SubType的实例既分别拥有自己的属性——包括colors属性,又可以使用相同的方法,
----------------- 我是分割线 -------------------------
----------------- 2016.11.04更新 -------------------
发现这样的写法有这样的问题:
1、SubType.prototype的constructor是SuperType
2、SubType包含了SuperType的公有属性:
更好的解决方案:
function SuperType(name) {
this.name = name;
this.colors = ["red","black"];
}
SuperType.prototype.sayName = function() {
alert(this.name);
};
function SubType(name, age) {
//继承构造器属性
SubType._super.call(this,name)
this.age = age;
}
SubType.prototype.sayAge = function() {
alert(this.age);
}
function inherit(subClass, superClass) {
function f() {
}
//通过桥接函数f嫁接
f.prototype = superClass.prototype;
//继承superClass的原型属性
subClass.prototype = new f();
//复原subClass的构造器
subClass.prototype.constructor = subClass;
//存储subClass的父级
subClass._super = superClass;
};
inherit(SubType, SuperType);
var instance1 = new SubType("sgoddon",21);
instance1.colors.push("green");
alert(instance1.colors); //"red,black,green"
instance1.sayName(); //"sgoddon"
instance1.sayAge(); //21
var instance2 = new SubType("Nick",18);
alert(instance2.colors); //"red,black"
instance2.sayName(); //"Nick"
instance2.sayAge(); //18
此方案生成的SubType.prototype为: