javascript的面向对象

来源:互联网 发布:编程师交流平台 编辑:程序博客网 时间:2024/09/21 09:27

   第一种我们用的javascrpt中获取对象的方法有通过new object获取,

function Person(name,age){
var p=new Object();
p.name=name;
p.age=age;
p.say=function(){
alert("名字"+this.name+",年龄"+this.age);
}
return p;
}
var p1=Person("小石头",22);
p1.say();
var p2=Person("鸡棚",33);
p2.say();

  使用这种方法定义的方式,虽然可以定义一个对象,但没有类的约束,没有办法实现重复使用,如果存在多个,就要去定义多个,回存在大量代码的重复,而且也很麻烦。

     第二种方法是json数据完成数据的传输,例如:

var Person= {
"name":"小石头",
"age" :22,
"sex" :"男",
"friends":["鸡棚","小爆","骚猪"],
"say":function(){
alert("名字叫:"+this.name+",年龄:"+this.age+",性别:"+this.sex+",朋友:"+this.friends)
}
}
Person.say();

虽然json的方式也可以定义对象,但它的对象也是不能重用的,所有这样用同样会造成一定的麻烦。

第三种使用工厂模式定义对象可以让对象重负使用,例如:

function Person(name,age){
var p=new Object();
p.name=name;
p.age=age;
p.say=function(){
alert("名字"+this.name+",年龄"+this.age);
}
return p;
}
var p1=Person("小石头",22);
p1.say();
var p2=Person("鸡棚",33);
p2.say();

使用工厂模式定义对象很好的解决了对象无法重复使用的缺点,但是另一个问题有来了,就是我们无法判断得到的对象的类型。

第四种使用构建函数来创建一个对象,这种基于构建函数的创建方式是javascript模拟面向对象语言的方式来实现对象的创建的。

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

var p1 = new Person("小石头",38);
var p2 = new Person("鸡棚",28);
p1.say();
p2.say();

  基于构建函数的定义的方式最大的好处除了对象重复使用外,就是可以判断他的类型。我们通过代码分析得知:say方法在每个对象创建后都存在了一个方法拷贝( 但是我们发现代码在只有调用时, say 方法才会在堆中创建),这样就增加了内存的消耗了,如果在对象中有大量的方法时,内存的消耗就会高,这样不行了。

我们把这个方法放到全局函数,这样所有的对象指向了一个方法。

解决方案就是将方法全部放在外面,成为全局函数
function Person(name,age) {
this.name =name;
this.age
=age;
可以将方法成为全局函数

;
}
functionsay() {
alert(
"我的名字是:"+this.name+",我今年"+this.age+"岁了");
}
varp1= newPerson("刘建宏",15);
p1.say();
varp2= newPerson("老徐",30);
p2.say();

但是这样写的话,会带来另一个问题,就是方法一点定义为全局函数,那么window
象就可以调用, 这样就破坏了对象的封装性。 而且如果有大量的方法,这样写导致整体代码充斥着大量的全局函数,这样将不利于开发。 所以我们急需一种可以完美的解决上述问题的方案,javascript 给我们提供了一种解决这些问题的方案,就是基于原型的对象创建方案

0 0
原创粉丝点击