函数重载、原型以及封装继承

函数重载:

js中会出现同名函数;
但是在前端程序执行中,后面的同名函数会覆盖前面的同名函数。这样就造成了我们分别给不同同名函数传参这个事情
无法直接进行;
为了解决这个问题;我们需要学习js的函数重载;
实现同名函数根据传参的数量不同来分别实现程序调用;
这个实现的原理是:根据形参的形参列表来进行判断;我们把形参的列表称为:类数组类对象;
这个类数组类对象:本质上是对象,只是具备了数组的一些特征;
1,可以像数组一样获取长度:length;
类数组类对象的专有称呼:arguments
arguments.length;
2可以通过下标获取某一个单一的形参元素;
arguments[0]

类数组类对象:只具备数组的部分特征,不能直接使用数组的方法;

面向对象的开发思想:

面向对象就必须先了解面向过程:
面向过程:就是每一个代码都是直接具体到每一个目标;如果我们想写多个目标就需要写多个程序;
弱点:代码的复用性极差,而且不利于后期的维护;
面向对象:是将经常重复使用的代码,单独封装到一个方法内,在需要的时候加以引用。不用的时候就不引用;这样提高了代码的使用效率。
降低了代码使用量;
面向对象里面包含了:
	封装和继承;
	封装是:实际就是将规律性代码封存在一个方法内,等待使用;
继承:就是将原来一个程序中具备的属性和方法都全部被另一个新的程序所使用;
JavaScript的继承是一种基于原型的继承;ES5版本以前的继承都是基于原型的继承;
原型:prototype;
它是对象在创建的时候的一种自带属性;
这个属性里面包含了对象所有的属性和方法;
我们把这种属性称为:原型对象;
原型对象和对象属于一体同生的;对象发生改变,原型一定改变,原型发生改变,对象不一定改变;
所有实例化子类对象,所拥有的父级属性和方法都是来自原型的内容。不是来自父类对象本身;

1,原型的属性会自动继承给实例化子类;但是子类的属性永远都是自己的,无法自动继承给别人;
2,我们可以通过A.prototype =new B()的方式实现A对B类的继承;
从而实现所有实例化子类a都能够拥有B的属性;
function A(a){
this.a=a;

}
function B(b){
	this.b=b;
	
}
var b=new B(13)
A.prototype=b;
console.log(A)
console.log(A.prototype.b)
var n=new A(12);
console.log(n.a);
console.log(n.b);

对象的属性遍历:
for in循环实现;
for(var key in obj){
console.log(key);
conosle.log(obj[key]);
}
对象的属性检测:
obj.hasOwnProperty(“属性名”);
对象的自有属性:
只是在当前的对象中可以使用的属性叫做自有属性;该属性一般不能直接其他的对象所使用;必须通过继承的方法才可以
公共属性:
公共属性是开放性的,只要创建实例化子类就可以直接去继承父类的属性和方法,这些属性和方法都被称为公共属性;

function Class(a,b){this.a=a;this.b=b};
function B(c,d){this.c=c;this.d=d}
var a=new Class();
var b=new B();
对象Class中的属性相对于对象B来说都是自有属性;
对象Class中的属性相对于对象a来说都是公共属性;

继承:

1,实现实例化子类统一对另一个父类的继承:
	function B(){}
	function A(){}
	var b=new B();
	var a=new A();
	B.prototype=new A();
	那么此时所有的实例化子类a都能够实现对对象B的继承;
2,实现一个单一的实例化子类对另一个父类的继承,同时其他的实例化子类不受影响;
	function B(){}
	function A(){}
	var a1=new A();
	var a2=new A()
	基本语法: Object.setPrototypeOf();表达的意思是:我们给一个对象设置一个原型对象从另外一个对象哪里获取;
	圆括号内的参数两个:第一个:需要参与继承别人属性的实例化对象;
						第二个:需要被继承的实例化对象;
						
	 Object.setPrototypeOf(a3,new B())
	 这个方法实现了a3对父类B的继承;
3,只是实现原型对象之间的继承:
	function B(){};
	function A(){};
	B.prototype=A.prototype;
	这样就可以实现B对A的继承;
	但是原型的修改不会影响到对象B的自身属性改变;
	例如:
	function B(){this.name="tom"}
		B.prototype.age=21;
		那么此时:console.log(B.age)//返回的是undefined
		为什么?
替代方法:call();apply();
A.call(B,data,data)//我们将A的方法替换了B里面的方法
A.apply(B,[data,data])//我们将A的方法替换了B里面的方法
call()里面的传值只能是一个个的传值;
apply()里面的传值是可以传入一个参数列表的;
function add(a,b){return a+b};
function sub(a,b){return a-b};
console.log(add.apply(sub,[4,2]));此时返回结果:6
sub.apply(add,[3,6]);此时返回结果是:-3
	(2)实现继承
	function Animal(name){
	  this.name = name;
	  this.showName = function(){
			alert(this.name);    
		}    
	}

	function Cat(name){
	  Animal.apply(this,[name]);    
	}

	var cat = new Cat("咕咕");
	cat.showName();

	/*call的用法*/
	Animal.call(this,name);

(3)多重继承
function Class10(){
this.showSub = function(a,b){
alert(a - b);
}
}

function Class11(){
this.showAdd = function(a,b){
alert(a + b);
}
}

function Class12(){
Class10.apply(this);
Class11.apply(this);
// Class10.call(this);
//Class11.call(this);
}

var c2 = new Class12();
c2.showSub(3,1); //2
c2.showAdd(3,1); //4

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值