JavaScript面向对象-3

对象的继承

1.定义

JavaScript是没有明确的继承机制,也是通过模仿实现的。

首先父类子类的构造函数是使用this关键字给所有属性和方法
赋值。为了实现继承,我们可以让父类的构造函数成为子类的方法。然后调用该子类的方法通过this关键字给的属性和方法赋值。这样子类就拥有父类的方法与属性了。

2.使用

方法一:使用函数来实现继承

第一步:在子类里面和父类进行关联

this.子类属性=父类构造函数名;

第二步;调用子类.关联函数名(【参数】);//这一步就是把父类的函数和方法加入到子类里面

this.子类属性(【参数】);

第三步 删除关联delete this.子类属性//这个时候父类的方法和属性已经父之过来了

调用函数的时候无论是那种方式都要有小括号

方法二:使用call或者apply来实现继承

call方法:

语法: obj.call(thisObj, arg1, arg2, …

apply方法: .

语法: obj.apply(thisObj, [arg1, arg2, …);

解释:就是把object的参数复制到了thisobject里面,this代表所有的参数;

相同点:都是把obj(即this)绑定到 thisObj, 这时候thisObj具备
了obj的属性和方法。或者说thisObj继承 了obj的属性和方法。
区别: apply接收的是数组参数, call接收的是连续参数。


<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>对象冒充方法</title>
		<script type="text/javascript">
			function add(a, b) {
				alert(a + b);
			}

			function sub(a, b) {
				alert(a - b);
			}

			add.call(sub, 8, 5);//这里的对象是sub一般书this

		</script>
	</head>
	<body></body>
</html>

显示是13

这个例子中改变sub对象的指向,sub指向了add,从而执行add
对象(函数)的操怍“8+5”。

注意: js 中的函数其实是对象,函数名是对Function对象的引
用。

再举一个例子

function Animal() {
	this.species = "动物";
  	this.species1 = "动物1";
}
//实现继承
function Cat(name, color) {
	this.name = name;
	this.color = color;
    Animal.call(this,this);
}

var cat = new Cat("猫", "白色");
document.write(cat.species); 
document.write(cat.species1); 

在这里插入图片描述

call和apply的缺点

这种办法只能继承父类的实例属性,因而找不到方法。

方法三:原型链继承方法

首先回顾下原型的概念 : Javascript规定,每一个构造函数都有一prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。那么我们可以将子类的prototype属性指向父类对象,继承父类的所有属性和方法从而实现继承。

JavaScript对象有一个特性,假设读取某个对象的属性x,首先会在这个对象的自身属性中查找。若没有找到,将会在此对象所处的原型链中查找属性x,一直到找到属性x或者无原型为止。

  对象属性分类:

  ① 自有属性:也可叫实例属性,指对象自身的属性。

  ② 继承属性:也可叫原型属性,指对象从原型中继承的属性。

凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象。

在这里插入图片描述
在这里插入图片描述
举个例子

function Person (name, age) {
    this.name = name;
    this.age = age;
  Person.prototype.say = function(){
    document.write('hello, my name is ' + this.name);
};
}

//在此添加代码
function Man() {}
Man.prototype = new Person('Jack',30);//直接让这个构造函数成为他的原型
var man = new Man();
man.say();
document.write("<br>"+man.name);

在这里插入图片描述

原型链继承的缺点

因为是公用的一个,函数或者是属性值,相当于java的final一个函数对象改变他,其他的对象在调用他的时候,用的是改变过后的

解决办法 组合继承

用借用构造函数模式来定义实例的属性,而原型模式用于定义方法和共享的属性

function Polygon(side) {
	this.side = side;
};

Polygon.prototype.getSize= function() {
	return 0;
};
//请修改Rectangle
function Rectangle(width, height) {
	this.width = width;
	this.height = height;
    Polygon.call(this,4);
};
Rectangle.prototype=new Polygon();
Rectangle.prototype.getSize=function()
{
  return this.width+"-"+this.height;//重点
  
};
var r = new Rectangle(3, 5);
document.write(r.side+"</br>");
document.write(r.getSize());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码浪人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值