js面向对象二--封装

来源:互联网 发布:网络科学引论 编辑:程序博客网 时间:2024/05/29 17:49

Javascript是基于对象的开发语言,遇到的所有复杂的东西都是对象,而面向对象开发语言的最主要特点就是:封装,继承,多态;本文从这三个点学习javascript的面向对象开发。
一、 封装
在程序开发中,我们经常会遇到各种各样的实例,例如:猫,狗,兔子然后在操作这些实例时是很浪费时间空间的,所以在开发中我们经常会抽象成一个对象存储,在具体应用时然后实例化成具体对象。它们都属于动物,我们可以抽象动物,然后根据不同的属性创建实例。从课本上总结了Javascript的封装形式发展有如下几种。
1、 工厂模式

function animal(type,name,age){    var o=new Object();    o.type=type;    o.name=name;    o.age=age;    o.say=function(){        alert(this.type);    };    return o;}var cat=animal('cat','sally','2');cat.say();var dog=animal('dog','nick','3');dog.say();

解决了创建多个相似对象的问题,但是没有解决对象识别的问题(即怎样知道一个对象的类型)
2、 构造函数模式
function Animal(type,name,age){
this.type=type;
this.name=name;
this.age=age;
this.say=function(){
alert(this.type);
};
}
var cat=new Animal(‘cat’,’sally’,’2’);
cat.say();
var dog=new Animal(‘dog’,’nick’,’3’);
dog.say();决了对象识别问题,能创建特定类型的对象,像Object,Array;创建实例的时候创建一个新对象,将构造函数的作用域赋给新对象,执行代码返回新对象,但是新的问题就是在全局作用域中定义的函数实际上是被某个对象调用,这让全局作用域有点名副其实。
3、 原型模式
我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象包含可以由特定类型的所有实例共享的属性和function Animal(){}
Animal.prototype.name=”cat”;
Animal.prototype.age=2;
Animal.prototype.say=function(){
alert(this.name);
}
var cat=new Animal();
cat.say(); //cat达到共享却不能通过对象实例重写原型的值;如果通过实例重写属性,实例对象就会屏蔽原型的属性
var dog=new Animal();
dog.name=”dog”;
dog.say();
构造函数,原型,实例三着之间的关系:
每个构造函数有个prototype属性指向原型对象,而原型对象里的constructor又指向构造函数,创建的实例都有一个[prototypr]指向原型对象;
这里写图片描述
原型的另一种写法就是对象字面量来重写整个原型对象,在以对象字面量的形式创建的prototype新对象,它的constructor不再指向Animal了,但是可以在字面量里定义出constructor这个属性指向构造函数。

Animal.prototype={    constructor:Animal,    name:"cat",    age:2,    say:function(){        alert(this.name)    } }

原型缺点:因为共享的本质,使得所有的方法和属性都共享,而有时实例对象需要自己的属性
4、 构造函数和原型模式组合
可以用构造函数定义实例的属性,原型模式定义共享的属性和方法

function Animal(type,name,age){    this.type=type;    this.name=name;    this.age=age;    this.friends=['cat1','cat2'];}Animal.prototype={    constructor:Animal,    say:function(){        alert(this.name);    }}var cat=new Animal('cat','sally',2);cat.friends.push("cat3");alert(cat.friends);  //cat1,cat2,cat3var dog=new Animal('dog','nick',3);alert(dog.friends);  //cat1,cat2
0 0
原创粉丝点击