js面向对象(二 prototype原型对象)

prototype代表原型,它是JavaScript内置类型的一个属性,它的值表示了一个类的成员的集合。因为Object类型是所有对象的原型,所以自定义类型对象也包含prototype原型对象。prototype对象允许将一个属性添加到指定的类型对象上。

function Person(){
//使用空构造函数定义Person类
};
Person.prototype.setName = function(pName){
//为Person类添加setName方法
this.name = pName;
};
Person.prototype.getName = function(){
 //为Person类添加getName方法
 return this.name;
}

  使用无类型对象的定义方式指定prototype对象

 

function Person(){
};//使用空构造函数定义Person类
Person.prototype = {
//使用无类型对象指定prototype的值
  age:20,
  setName:function(pName){
  this.name = pName;
  },
  getName:function(){
  return this.name;
 },
  getInfo:function(){
   return "I am " + this.name + ".I'm " + this.age + " years old!";
   }
};

 Person对象的创建过程解释器首先创建一个新对象,然后让this指针指向它;将函数的prototype对象的所有成员都赋给 这个新对象;执行函数体,对这个对象进行初始化操作;返回已创建的对象。

  继承是面向对象思想中另外一个重要的特征
继承为软件开发主要带来两方面的好处:
代码重用
在一定程度上减少显示类型转换的代码
JavaScript是一种弱类型语言,本身也没有严格意义上的类的概念,所以它并不包含显示类型转换的语言特征。

   共享prototype实现继承-1
实现继承的主要目的是代码重用,或者说是对象的成员的共享。
protype原型对象是对象成员的集合,因此可以可以通过共享prototype实现继承

 

ChildObject.prototype = ParentObject.prototype;

 创建Mammal类

 

function Mammal(){
//哺乳动物类定义
this.name = "Mammal";//添加name成员属性
}
Mammal.prototype.eat = function(){
//添加eat成员方法
alert(this.name + " is eating!");
};
Mammal.prototype.sound = function(){
//加sound成员方法
alert(this.name + " is sounding.....");
};

  创建Cat类

function Cat(){
//猫类定义
 this.name = "Cat";//添加name成员属性
}
 //通过prototype对象共享实现Cat继承Mammal
 Cat.prototype = Mammal.prototype;
 var cat = new Cat();
 cat.eat();
 cat.sound();

  重写Cat类的sound方法

 

Cat.prototype.sound = function(){
//重写Mammal类的sound方法
alert(this.name + " is miaowing!")

} 
var m = new Mammal();
m.eat();
m.sound();

  利用共享prototype对象实现JavaScript继承虽然简单,但如果子类重写了父类的方法,父类也会受到影响
通过复制一份父类prototype对象中的成员集合给子类,这样子类在重写方法时就不会影响到父类了

 

for(var i in Mammal.prototype){
//遍历原型对象中的类成员
Cat.prototype[i] = Mammal.prototype[i];//进行原型复杂
} 

 大部分面向对象语言为了定义抽象方法或抽象类都提供了诸如“abstract”、“virtual”等关键字。

 JavaScript语言中虽未提供类似的关键字,但实现抽象的方式却异常简单。
 在JavaScript中,抽象方法是没有被定义、但却被this指针直接引用的方法。(在一种已经说了)

function Shape(){}//创建形状类
//为Shap类添加drawShap方法,注意其中调用了一个未定义的抽象方法
rawShape.prototype.drawShap = function(){
 this.draw();//可以当做是一个abstruct
}

 创建圆类和正方形类

 

function Circle(){}//创建圆形类
function Square(){}//创建正方形类

 利用反射机制实现圆形类继承形状类、正方形继承形状类

for(var i in Shape.prototype){
Circle.prototype[i] = Shape.prototype[i];
Square.prototype[i] = Shape.prototype[i];
}

 为Circle类和Square类添加draw抽象方法实现

Circle.prototype.draw = function(){
alert("画圆...");
};
Square.prototype.draw = function(){
alert("画正方形...");
};

 测试

var shape1 = new Circle();
var shape2 = new Square();
shape1.drawShap();
shape2.drawShap();

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值