您的位置:首页 > Web前端 > JavaScript

JavaScript面向对象

2016-10-09 09:41 295 查看

javaScript面向对象

面向对象的特征:

封装

继承

多态

JavaScript中没有多态,只有继承和封装

JavaScript如何实现封装?

javascript是一种基于对象的语言,但又不是一种真正的面向对象的语言,它没有类,所以要把属性和方法封装在对象中。在js中怎样得到一个对象呢?

1.json方式

var Person={
name:"liyanan",
age:"21",
say:function(){
alert("我的名字是:"+this.name+","+"我的年龄是:"+this.age);
}
};

var me=new Person();
me.say();


2.直接new一个object对象(不常用)

var cat=new Object();
cat.name="liyanan";
cat.age=21;
cat.say=function(){
alert("我的名字是:"+this.name+","+"我的年龄是:"+this.age);
};


注:上面两种得到对象的方式存在缺陷,主要缺陷:

1.因为没有类的约束,使得程序员没有一个统一的规范来写

2.没办法实现对象的重用

3.使用工厂方式创建对象

function createObject(name,age){
var o=new Object();
o.name=name;
o.age=age;
o.say=function(){
alert("我的名字是:"+this.name+","+"我的年龄是:"+this.age);
}
return o;
}
var p1=createObject("liyanan",21);
p1.say();


注:这种方式创建对象,虽然解决了上面的两个问题,但是我们没有办法判断函数的类型。

4.使用构造函数创建对象

function Person(name,age){
this.name=name;//this会绑定在实例对象上
this.age=age;
this.say=function(){
alert("我的名字是:"+this.name+","+"我的年龄是:"+this.age);
}
}

var p1 = new Person("liyanan",21);
var p1 = new Person("lyn",19);

p1.say();
p2.say();

alert(typeof(p1));//等于alert(typeof p1);

alert(p1.instanceof Person);//判断p1是否是Person类型,返回true or false.

alert(p1.constructor == Person);//constructor指向它们的构造函数

//p1和p2的say()方法是一样的,每次调用这个方法就会开辟一块内存,并且这块内存还不会被回收,因此构造函数方式创建对象也存在内存消耗的缺陷。


注:使用构造函数方式创建对象解决了使用工厂模式不能判断对象的类型的缺陷。但是,使用构造函数构造对象的方法,对象在调用函数之后,不会自动释放内存,造成对内存的大量消耗。在对象使用完毕后,使用p1=null;将对象置空,可以回收这块对象指向的内存。

解决内存消耗

function Person(name,age){
this.name=name;//this会绑定在实例对象上
this.age=age;
this.say=say;
}
function say(){
alert("我的名字是:"+this.name+","+"我的年龄是:"+this.age);
}

var p1=new Person("liyanan",13);
var p2=new Person("lyn",12);
p1.say();
p2.say();
//现在p1,p2指向同一块say()内存.


注:这种方式虽然解决了内存消耗,但是此时say()变成了全局函数,不符合对象的封装标准,为了解决这个问题,可以使用原型方式创建对象。

5.使用原型Prototype定义对象

Javascript规定,每一个函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。

//使用prototype方式创建对象
function Person(){

}
//原型的扩充
Person.prototype.name="liyanan";
Person.prototype.age=13;
Person.prototye.say=function(){
alert("我的名字是:"+this.name+","+"我的年龄是:"+this.age);
}


//使用Prototype创建对象的第二种方式

function Person(){

}
//原型的重写
Person.prototype={
constructor:Person,//当原型重写了
bd4a
之后,手动将构造器指向Person
name:"lyn",
age:13,
say:function(){
alert("我的名字是:"+this.name+","+"我的年龄是:"+this.age);
}
};


封装:要把对象的属性和方法进行封装

6.基于组合(构造函数加原型)的封装(常用):

function Person(name,age){
//构造函数定义属性
this.name=name;
this.age=age;
}
//原型定义方法
Person.prototype.say=function(){
alert("我的名字是:"+this.name+","+"我的年龄是:"+this.age);
}

var p1=new Person("liyanan",13);
p1.say();//我的名字是:liyanan,我的年龄是


注:

7.基于动态原型链的方式(选学)

function Person(){
this.name=name;
this.age=age;
if(!Person.prototype.say){
Person.prototype.say=function(){
alert("我的名字是:"+this.name+","+"我的年龄是:"+this.age);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息