javascript 继承(extend)

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>javascript 继承</title>
<script type="text/javascript" src="js/common.js"></script>
<script type="text/javascript">
	//继承
	println("---继承---");
	println("---原型链---");
	function SuperType(){
		this.superProperty = true;
	}
	SuperType.prototype.getSuperProperty = function(){
		return this.superProperty;
	}
	
	function SubType(){
		this.subProperty = false;
	}
	
	SubType.prototype = new SuperType();
	
	SubType.prototype.getSubProperty = function(){
		return this.subProperty;
	}
	
	var sub = new SubType();
	println("superProperty = " + sub.getSuperProperty() + ", subProperty = " + sub.getSubProperty());
	
	//借用构造函数继承
	println("----借用构造函数继承,无法继承父类原型中的方法----");
	function Animal(name, color){
		this.name = name;
		this.color = color;
		this.sayName = function(){
			println("name = " + this.name);
		}
		
	}
	
	Animal.prototype.showInfo = function(){
		println("name = " + this.name + ", color = " + this.color);
	};
	
	function Dog(name,color){
		Animal.apply(this, arguments);//本质:在子类的构造函数中调用父类的构造函数,所有父类原型中的方法必不能在子类中继承下来
	}
	
	var dog = new Dog("dog","white");
	//dog.showInfo();//不能调用,没有从父类继承
	dog.sayName();
	
	//组合使用原型继承和构造函数继承
	println("---组合使用原型继承和构造函数继承,完美,能继承父类所有的方法---");
	function Pig(name,color){
		Animal.apply(this, arguments);//第二次调用父类构造方法;//or use call method
	}
	
	Pig.prototype = new Animal();//第一次调用父类构造方法
	Pig.prototype.sayColor = function(){
		println("color = " + this.color);
	}
	
	var pig = new Pig("pig", "colorful");
	pig.sayName();
	pig.sayColor();
	pig.showInfo();
	
	//原型式继承
	println("---原型式继承---");
	//原理
	function object(o){
		function F(){}
		F.prototype = o;
		return new F();
	}
	var car = {
		name:"laoshi",
		drivers:["jhon", "kitty"]
	}
	var otherCar = object(car);
	println(otherCar.drivers.join(","));
	var anotherCar = object(car);
	otherCar.drivers.push("noty");
	println(anotherCar.drivers.join(","));
	//在ECMAScript5中规范了此原型式继承:使用Object.create()方法
	var person = {
		name:"zizhu",
		friends:["xia", "xu"]
	}
	var p1 = Object.create(person);	
	var p2 = Object.create(person);
	p1.friends.push("yan");
	println("after p1 push yan, and p2.friends = " + p2.friends.join(","));
	
	//寄生式继承
	println("---寄生式继承---");
	function createAnother(original){
		var clone = object(original);//复制original对象
		clone.sayName = function(){//增强原来对象的方法
			println("name = " + this.name);
		}
		return clone;		
	}
	
	var another = createAnother(person);
	another.sayName();
	
	//寄生组合式继承
	println("----寄生组合式继承---");
	function Shape(name,count){
		this.name = name;
		this.count = count;
	}
	
	Shape.prototype.showInfo = function(){
		println("name = " + this.name + ", count = " + this.count);
	}
	
	function Triangle(name, count){
		Shape.apply(this, arguments);
	}
	
	//继承核心函数
	function inheritProperty(sub, sup){
		var proto = Object.create(sup.prototype);
		proto.constructor = sub;
		sub.prototype = proto;
	}
	
	inheritProperty(Triangle, Shape);
	Triangle.prototype.sayName = function(){
		println("name = " + this.name);
	}
	var triangle = new Triangle("三角形",3);
	triangle.showInfo();//从父类继承
	triangle.sayName();
		
</script>
</head>
<body>
</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值