JavaScript面向对象编程

我们使用JavaScript为实现以下面向对象特性:
1.对象、类; 2.封装; 3.继承

一、对象
在JavaScript中创建一个对象非常简单,我们可以使用内建的Object对象来创建一个对象:

var myObj = new Object;
myObj.name = 'sam';
myObj.age = 24;


同样我们也可以使用JSON(JavaScript Object Notation)来创建一个对象:
var myObj ={name:'sam',age:24};



二、类

JavaScript通过构造函数和原型对象(prototype)来实现类的创建:

function Person(name,age){  //定义构造方法
this.name = name;
this.age = age;
}

var sam = new Person('sam',24);
alert(sam.name); //输出结果为 sam

var bob = new Person('bob',30);
alert(bob.age); //输出结果为 30



下面将在Person类中添加一下方法:
function Person(name,age){
this.name = name;
this.age = age;
this.introduceSelf = function(){
alert('I am '+name+', I am '+age+' years old.');
}
}

var sam = new Person('sam',24);
sam.introduceSelf(); //输出结果为: I am sam, I am 24 years old.

var bob = new Person('bob',30);
bob.introduceSelf(); //输出结果为: I am bob, I am 30 years old.



上面的添加方法的方式不是很好,因为introduceSelf函数对于所有Pesron的实例来说不,都是一样的,我们不希望在实例级别加上一个对于所有实例来说都是一样的方法。这里我们要引入原型对象(prototype)

function Person(name,age){//定义构造方法(类)
this.name = name;
this.age = age;
}

Person.prototype.kind = 'animal'; //在原型对象中添加一下属性kind

//创建两个实例
var p1 = new Person('sam',24);
var p2 = new Person('bob',30);

//访问这两个实例的kind属性
alert(p1.kind); //输出结果animal
alert(p2.kind); //输出结果animal



通过上面的例子,我们可以看到函数的原型对象对于所有的实例来说是共享的,并且属性的访问方式和实例本身的属性文章方式一样

如果修改这个属性呢?
p1.kind = 'male';
alert(p1.kind); //输出结果 male
alert(p2.kind); //输出结果 animal



对于属性的访问,JavaScript会从对象的本身开始查找,如果找到则返回找到的值,如果没有,才会在其原型对象中查找

回到原来的例子,在构造函数Person的原型对象上添加一个方法,这样这个方法就会被所有的Person对象共享:
Person.prototype.introduceSelf = function(){
alert('I am '+this.name+' , I am '+this.age+' years old');
}
var p1 = new Person('sam',24);
var p2 = new Person('bob',30);
p1.introduceSelf(); //输出结果为:I am sam, I am 24 years old
p2.introduceSelf(); //输出结果为:I am bob, I am 30 years old



三、多态
JavaScript允许我们将任意一个函数分配给对象的一个属性。当使用obj.function的语法调用函数时,将把函数原来定义this的指向当前这个对象的obj。所以,我们可以通过定义有相同的方法的对象,来简单地实现多态(polymorphism)

//定义一个dogSpeek函数
function dogSpeek(){
alert('I am '+this.name);
}

//定义一个Dog类
function Dog(){
this.name = name;
this.speek = dogSpeek();//将dogSpeek函数赋给Dog的speek属性
}

//定义一个catSpeek函数
function catSpeek(){
alert('I am '+this.name);
}

//定义一个Cat类
function Cat(){
this.name = name;
this.speek = catSpeek();//将catSpeek函数赋给Cat的speek属性
}

var dog = new Dog;
dog.speek();//输出'I am dog'
var cat = new Cat;
cat.speek();//输出'I am cat'

对于同一个方法,不同类的对象就展现出不同的行为,这样就实现了多态性。


四、继承
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值