javascript面向对象 代码详解(六)

//继承,通过原型链条实现
//被继承的函数叫做超类型(父类、基类)
function Box()           
{
<span style="white-space:pre">	</span>this.name = "Lee";
}
//继承的函数叫做子类型(子类、派生类)
function Desk()
{
<span style="white-space:pre">	</span>this.age = 100;
}
function Table()
{
<span style="white-space:pre">	</span>this.level = "AAA";
}


//通过原型链继承
//超类型实例化后的对象实例,赋值给子类型的原型属性
//new Box()会将Box构造里的信息和原型的信息都交给Desk




//Desk的原型。得到的是Box的构造+原型里的信息
Desk.prototype = new Box();
Table.prototype = new Desk();




var box = new Box();
alert(box.constructor);


var table = new Table();
//alert(desk.age);
//alert(desk.name);
alert(table.level)
alert(table.name)
alert(table.age)




//从属关系
function Box()           
{
	this.name = "Lee";
}
//构造里面有属性,原型里面也有相同的属性
Box.prototype.name = "Jack";


function Desk()
{
	this.age = 100;
}

//通过原型链继承
Desk.prototype = new Box();
var desk = new Desk();
var box = new Box();
//就近原则,实例里有就返回,没有就查原型
alert(desk.name);

//子类型从属于自己或者他的超类型

alert(desk instanceof Object) //true
alert(desk instanceof Desk) //true
alert(desk instanceof Box) //true
alert(box instanceof Desk) //false

//使用对象冒充继承(解决传参问题)
function Box(name ,age )
{
	this.name = name;
	this.age = age;
	//this.family = ["哥哥","姐姐","妹妹"]; //引用类型放在构造里不会共享
}

Box.prototype.family = "家庭";

function Desk(name ,age )
{
	//this代表Desk本身
	//Desk冒充Box
	Box.call(this,name,age);  //对象冒充,只能继承构造里的信息,原型里继承不了
	
}

var desk = new Desk("Lee",100);
alert(desk.name);
alert(desk.age);
//该方法原型里的数据继承不过来
alert(desk.family);

function Box(name ,age )
{
	this.name = name;
	this.age = age;
	this.family = ["哥哥","姐姐","妹妹"]; 

}


//构造函数里的方法,放在构造里,每次实例化都会分配一个内存地址、浪费空间
//所以最好放在原型里,保证多次实例化只有一块地址
Box.prototype.run = function()
{
	return this.name + this.age + "运行中...";
}


function Desk(name ,age )
{
	Box.call(this,name,age); 
}

var desk = new Desk("Lee",100);
//Uncaught TypeError: Object #<Desk> has no method 'run' 
alert(desk.run());


//组合模式(原型链+借用构造函数)
function Box(name ,age )
{
	this.name = name;
	this.age = age;
	this.family = ["哥哥","姐姐","妹妹"]; 

}


//构造函数里的方法,放在构造里,每次实例化都会分配一个内存地址、浪费空间
//所以最好放在原型里,保证多次实例化只有一块地址
Box.prototype.run = function()
{
	return this.name + this.age + "运行中...";
}


function Desk(name ,age )  //对象冒充
{
	Box.call(this,name,age); 
}

Desk.prototype = new Box();   //原型链继承

var desk = new Desk("Lee",100);
//Uncaught TypeError: Object #<Desk> has no method 'run' 
alert(desk.run());


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值