学习《javascript高级程序设计》笔记——最常用的继承模式

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的公有属性:

  1. colors:Array[2]
  2. name:undefined

更好的解决方案:

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为:



你看出其中的异同了吗?^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值