面向对象
一,面向对象
传统面向对象----也称OPP,典型特点:具有类的概念
通过类可以创建多个具有相同属性和方法的对象。
Javascript面向对象 ---- 叫做函数式的面向对象
通过【函数】模拟,实现【面向对象】的特点
二,面向对象的几种方法:
1,Javascript对象声明:
缺点:每个对象必须独立声明和设定
2,工厂模式
优点:精简代码,封装对象-----将相同代码封装到一个函数中,通过传参进行调用
解决重复实例化的问题。
缺点:如果多个不同函数同时声明对象,则无法准确定位对象实例的引用归属
function obj(name,sex){
Var obj = new Object();
obj.name = name;
obj.sex = sex;
obj.go = function(){
alert(this.name + ‘--’ + this.sex);
}
return obj;
}
Var obj1 = obj(‘帅男’,’男’);
Var obj2 = obj(‘妹妹’,’女’);
3,构造函数声明 ------【对象独立】
function Box() { } var obj = new Box();
优点:构造函数声明,对象会在后台,自动生成并返回出来。解决了对象能够准确识别的问题。
不同的构造函数,创立的对象是独立的。
对象所属判断:对象 instanceof 构造函数
例如:box instanceof Box;
【注意】:1,构造函数声明对象,必须要通过new方法声明才行。
2,声明对象实例的【引用地址】都是相互独立的。
function Box(name,age){
this.name = name;
this.age = age;
this.run = function(){
Return this.name+this.age;
}
}
function Pox(name,age){
this.name = name;
this.age = age;
this.run = function(){
Return this.name+this.age;
}
}
Var box1 = new Box(‘小明’,26)
Var box2 = new Pox(‘小张’,30)
注意:声明的对象,内容程序都一样,但都是相互独立存在的
【二】, 原型属性----prototype属性-----【对象共享】
函数中默认具有【prototype属性】--------这个属性也是一个【对象】
【功能】:实现通过【同一个构造函数】声明的【不同对象】都具备相同的【属性】和【方法】。
function Box(){}
Box.prototype.name = “羊吃草吗”;
Box.prototype.age = 24;
Box.prototype.run = function(){
return this.name + this.age;
}
Var box2 = new Box();
Var box1 = new Box();
【注意】:1, 声明对象的【引用地址】都是【同一引用地址】。
2,生成的对象的【属性】、【方法】都是一样的。
3, 【构造函数】里面的【属性或方法】比【原型设定】的优先级高。
4,【原型】的【属性】和【方法】一旦设定后,就不会改变。
【原型初始化】时,【实例对象】的数据都会保持一致。
5,【实例对象】是可以修改的,则修改后的数据不共享,都是相互独立的。
6,获取【属性和方法】如果【实例中没有】,就会向【原型】中找。
【三】,构造函数 + 原型链 生成对象
function Box(age,name){
this.age = age;
this.name = name;
this.arr = [1,2,3,4,5];
}
Box.prototype.run = function(){
return this.age + '---' + this.name;
}
var box1 = new Box(24,'张三');
var box2 = new Box(22, '李四');
//----继承
function Child(age,name){
Box.call(this,age,name);
}
Child.prototype = new Box();
var child = new Child(66,'王五');
alert(child.name);