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();
分享到:
相关推荐
JS面向对象经典案例,JS面向对象过程中用到的一些技术,例如对象、类、JS继承Call、JS原型链Prototype、JS闭包等等
原型是理解继承概念的关键, 我们将会教你如何建立原型, 如何检测一个对象是否是另外一个对象的原型, 及其 JavaScript 的模型与Java 面向对象编程之间的区别。我们同样会向你展示如何检测对象所包含的各种属性的方法...
JavaScript中对象的prototype属性,可以返回对象类型原型的引用。这是一个相当拗口的解释,要理解它,先要正确理解对象类型(Type)以及原型(prototype)的概念。 1 什么是prototype JavaScript中对象的prototype属性,...
用过JavaScript的同学们肯定都对prototype如雷贯耳,但是这究竟是个什么东西却让初学者莫衷一是,只知道函数都会有一个prototype...不像传统的面向对象语言,Javascript的继承机制基于原型,而不是Class类。 1、私有
-目的说明它是在第1,2阶段文档演示的JavaScript面向对象的书写方式的进一步改进,它是现代JavaScript面向对象编程方式(使用基本类来编码)的过渡代码--没有它就没有当今的JS OOP--此人非常牛!!! 4. 最后使用IE...
在prototype.js中,prototype对象是实现面向对象的一个重要机制。 每个函数(Function)就是一个对象,函数对象都有一个子对象 prototype对象,类是以函数的形式来定义的。prototype表示该函数的原型,也表示...
主要介绍了JavaScript使用prototype原型实现的封装继承多态,涉及javascript prototype与面向对象程序设计相关操作技巧,需要的朋友可以参考下
在prototype.js中,prototype对象是实现面向对象的一个重要机制。 每个函数就是一个对象(Function),函数对象都有一个子对象 prototype对象,类是以函数的形式来定义的。prototype表示该函数的原型,也表示一个类...
本文实例讲述了JavaScript面向对象程序设计中对象的定义和继承。分享给大家供大家参考,具体如下: 在面向对象的Javascript编程中,希望代码优雅有高效是非常重要的。javascript中不存在类的概念,只有对象。要想把...
通过掌握原型链的概念和工作原理,开发者可以更好地利用 JavaScript 的面向对象特性。 这是一个可编辑的xmind文件,对原型链有清晰的勾画,不同的链用不同颜色进行了标识,内容一目了然,可以帮助快速学习原型链。
本文实例讲述了JavaScript使用Prototype实现面向对象的方法。分享给大家供大家参考。具体分析如下: prototype 是 Function 对象的一个属性,这个属性指向另一个对象。 这个对象的所有属性和方法,都会被构造函数的...
无论什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。在默认情况下,所有的原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含...
接着上文《详解JavaScript基于面向对象之创建对象(1)》继续学习。 4、原型方式 我们创建的每个函数都有一个通过prototype(原型)属性,这个属性是一个对象,它的用途是包含可以由特定类型的所有实例共享的属性和...
我们创建的每一个函数都有一个prototype(原型)属性,该属性是一个对象,包含可以有特定类型的所有实例共享的属性和方法。使用它的好处就在于可以让所有对象实例共享它所包含的属性和方法,也就是说,不必在构造...
因为JavaScript是基于原型(prototype)的,没有类的概念(ES6有了,这个暂且不谈),我们能接触到的都是对象,真正做到了一切皆为对象 所以我们再说对象就有些模糊了,很多同学会搞混类型的对象和对象本身这个概念...
在prototype.js中,prototype对象是实现面向对象的一个重要机制。 每个函数就是一个对象(Function),函数对象都有一个子对象 prototype对象,类是以函数的形式来定义的。prototype表示该函数的原型,也表示一个类...
在prototype.js中,prototype对象是实现面向对象的一个重要机制。 每个函数就是一个对象(Function),函数对象都有一个子对象 prototype对象,类是以函数的形式来定义的。prototype表示该函数的原型,也表示一...
实际上不是SubType的原型的constructor属性被重写了,而是SubType的原型指向了另一个对象——SuperType的原型,而这个原型对象的construtor属性指向的是SuperType function SuperType(){ this.property = true; }...
本文实例讲述了JavaScript 面向对象。分享给大家供大家参考,具体如下: JavaScript 面向对象 this:this代指对象(python self) 对象 = new 函数():创建对象:添加“new 函数()”相当与创建对象 类名:prototype...
实际上JavaScript并不是一门面向对象的语言,不过JavaScript基于原型链的继承方式、函数式语法,使得编程相当灵活,所以可以利用原型链来实现面向对象的编程。 之前对JavaScript一直都是一知半解,这两天看了一下...