javascript面向对象程序设计

时间:2023-03-08 19:02:18

在学习js面向对象编程之前,首先须要知道什么是面向对象。面向对象语言都有类的概念,通过它能够创建具有同样属性和方法的对象。但js并没有类的概念,因此js中的对象和其它语言的对象有所不同。

js对象能够定义为:”无需属性的集合,其属性能够是基本值、对象和函数。每一个对象都是基于一个引用类型创建的。

js创建对象有下面两种方法:

1、创建一个Object实例:

var person = new Object();

2、使用对象字面量:

 var person ={};

3、工厂模式:

  function createPerson(name,age,job){
var p = new Object();
p.name=name;
p.age=age;
p.job=job;
return p;
}
var p1=createPerson("jack",22,“front-end Engineer");
var p2=.....;

4.构造函数模式:

 function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){alert(this.name);};
}
var p1= new Person("jack",22,"front-end Engineer");
var p2=...;

这里暂停一下,由于构造函数模式比較重要,这里解释一下:这里实际上是经历了下面4个步骤:

(1)创建一个对象;

(2)将构造函数作用域赋给这个对象(所以this将指向这个新创建的对象)

(3)运行里面的代码,为新对象加入属性;

(4)返回新对象;

上面创建的p1和p2都有一个constructor的属性,它指向Person。而且p1和p2即使Person的实例,同一时候也是Object的实例,由于全部对象都继承自Object。

缺陷:每一个方法都要在实例上又一次创建一遍,js中的函数是对象,因此能够将函数转移到构造函数的外部:

 function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=sayName;
}
fucntion sayName(){
alert("this.name");
}
var p1=.....;
var p2=....;

5.原形模式:

我们创建的函数都有一个prototype属性,它是一个指向一个对象的指针。

6.抽象函数:

Object.extend=function(destination,source){
for(property in source){
destination[property]=source[property];
}
return destination;
}
//定义一个抽象基类base,无构造函数
function base(){}; base.prototype={
initialize:function(){
this.oninit();//调用了一个虚方法
}
}
function SubClassA(){
//构造函数
}
SubClassA.prototype=Object.extend({
propInSubClassA:"propInSubClassA",
oninit:function(){
alert(this.propInSubClassA);
}
},base.prototype); function SubClassB(){
//构造函数
}
SubClassB.prototype=Object.extend({
propInSubClassB:"propInSubClassB",
oninit:function(){
alert(this.propInSubClassB);
}
},base.prototype); var objA=new SubClassA();
objA.initialize();//输出"propInSubClassA" var objB=new SubClassB();
objB.initialize();//输出"propInSubClassB"