站长百科 | 数字化技能提升教程 数字化时代生存宝典
首页
数字化百科
电子书
建站程序
开发
服务器
办公软件
开发教程
服务器教程
软件使用教程
运营教程
热门电子书
WordPress教程
宝塔面板教程
CSS教程
Shopify教程
导航
程序频道
推广频道
网赚频道
人物频道
网站程序
网页制作
云计算
服务器
CMS
论坛
网店
虚拟主机
cPanel
网址导航
WIKI使用导航
WIKI首页
最新资讯
网站程序
站长人物
页面分类
使用帮助
编辑测试
创建条目
网站地图
站长百科导航
站长百科
主机侦探
IDCtalk云说
跨境电商导航
WordPress啦
站长专题
网站推广
网站程序
网站赚钱
虚拟主机
cPanel
网址导航专题
云计算
微博营销
虚拟主机管理系统
开放平台
WIKI程序与应用
美国十大主机
编辑“
通过prototype属性建立面向对象的JavaScript
”
人物百科
|
营销百科
|
网赚百科
|
站长工具
|
网站程序
|
域名主机
|
互联网公司
|
分类索引
跳转至:
导航
、
搜索
警告:
您没有登录。如果您做出任意编辑,您的IP地址将会公开可见。如果您
登录
或
创建
一个账户,您的编辑将归属于您的用户名,且将享受其他好处。
反垃圾检查。
不要
加入这个!
<span style="text-align:center; border:1px solid #000; float:right; padding:6px;"><strong>导航:</strong> [[Ajax学习教程#Ajax学习教程|上一页]] | {{template:开发语言导航}}</span> <div style="clear:both;"></div> JavaScript通过一种链接机制来支持继承,而不是通过完全面向对象语言(如Java)所支持的基于类的继承模型。每个JavaScript对象都有一个内置的属性,名为prototype。prototype属性保存着对另一个JavaScript对象的引用,这个对象作为当前对象的父对象。 <br> 当通过点记法引用对象的一个函数或属性时,倘若对象上没有这个函数或属性,此时就会使用对象的prototype属性。当出现这种情况时,将检查对象prototype属性所引用的对象,查看是否有所请求的属性或函数。如果prototype属性引用的对象也没有所需的函数或属性,则会进一步检查这个对象(prototype属性引用的对象)的prototype属性,依次沿着链向上查找,直到找到所请求的函数或属性,或者到达链尾,如果已经到达链尾还没有找到,则返回undefined。从这个意义上讲,这种继承结构更应是一种“has a”关系,而不是“is a”关系。<br> 如果你习惯于基于类的继承机制,那么可能要花一些时间来熟悉这种prototype机制。prototype机制是动态的,可以根据需要在运行时配置,而无需重新编译。你可以只在需要时才向对象增加属性和函数,而且能动态地把单独的函数合并在一起,来创建动态、全能的对象。对prototype机制的这种高度动态性可谓褒贬不一,因为这种机制学习和应用起来很不容易,但是一旦正确地加以应用,这种机制则相当强大而且非常健壮。<br> 这种动态性与基于类的继承机制中的多态概念异曲同工。两个对象可以有相同的属性和函数,但是函数方法(实现)可以完全不同,而且属性可以支持完全不同的数据类型。这种多态性使得JavaScript对象能够由其他脚本和函数以统一的方式处理。<br> 图5-15显示了实际的prototype继承机制。这个脚本定义了3类对象:Vehicle、Sports- Car和CementTruck。Vehicle是基类,另外两个类由此继承。Vehicle定义了两个属性:wheelCount和curbWeightInPounds,分别表示Vehicle的车轮数和总重量。JavaScript不支持抽象类的概念(抽象类不能实例化,只能由其他类扩展),因此,对于Vehicle基类,wheelCount默认为4,curbWeightInPounds默认为3 000。<br> [[Image:image0150.jpg]] 图5-15 Vehicle、SportsCar和CementTruck对象之间的关系<br> 注意,这个UML图展示了SportsCar和CementTruck对象覆盖了Vehicle的refuel和mainTasks函数,因为一般的Vehicle、SportsCar(赛车)和CementTruck(水泥车)会以不同的方式完成这些任务。SportsCar与Vehicle的车轮数相同,所以SportsCar的wheelCount属性不会覆盖Vehicle的wheelCount属性。CementTruck的车轮数和重量都超过了Vehicle,所以CementTruck的wheelCount和curbWeightInPounds属性要覆盖Vehicle的相应属性。<br> 代码清单5-2包含了定义这3个类的JavaScript代码。要特别注意如何在对象定义中对属性和函数附加prototype关键字,还要注意每个对象由一个构造函数定义,构造函数与对象类型同名。<br> 代码清单5-2 inheritanceViaPrototype.js<br> /* Constructor function for the Vehicle object */<br> function Vehicle() { }<br> /* Standard properties of a Vehicle */<br> Vehicle.prototype.wheelCount = 4;<br> Vehicle.prototype.curbWeightInPounds = 4000;<br> /* Function for refueling a Vehicle */<br> Vehicle.prototype.refuel = function() {<br> return "Refueling Vehicle with regular 87 octane gasoline";<br> }<br> /* Function for performing the main tasks of a Vehicle */<br> Vehicle.prototype.mainTasks = function() {<br> return "Driving to work, school, and the grocery store";<br> }<br> /* Constructor function for the SportsCar object */<br> function SportsCar() { }<br> /* SportsCar extends Vehicle */<br> SportsCar.prototype = new Vehicle();<br> /* SportsCar is lighter than Vehicle */<br> SportsCar.prototype.curbWeightInPounds = 3000;<br> /* SportsCar requires premium fuel */<br> SportsCar.prototype.refuel = function() {<br> return "Refueling SportsCar with premium 94 octane gasoline";<br> }<br> /* Function for performing the main tasks of a SportsCar */<br> SportsCar.prototype.mainTasks = function() {<br> return "Spirited driving, looking good, driving to the beach";<br> }<br> /* Constructor function for the CementTruck object */<br> function CementTruck() { }<br> /* CementTruck extends Vehicle */<br> CementTruck.prototype = new Vehicle();<br> /* CementTruck has 10 wheels and weighs 12,000 pounds*/<br> CementTruck.prototype.wheelCount = 10;<br> CementTruck.prototype.curbWeightInPounds = 12000;<br> /* CementTruck refuels with diesel fuel */<br> CementTruck.prototype.refuel = function() {<br> return "Refueling CementTruck with diesel fuel";<br> }<br> /* Function for performing the main tasks of a SportsCar */<br> CementTruck.prototype.mainTasks = function() {<br> return "Arrive at construction site, extend boom, deliver cement";<br> }<br> 代码清单5-3是一个很小的Web页面,展示了这3个对象的继承机制。这个页面只包含3个按钮,每个按钮创建一个类型的对象(Vehicle、SportsCar或CementTruck),并把对象传递到describe函数。describe函数负责显示各个对象的属性值,以及对象函数的返回值。注意,describe方法并不知道它描述的对象是Vehicle、SportsCar,还是CementTruck,它只是认为这个对象有适当的属性和函数,并由这个对象返回自己的值。<br> 代码清单5-3 inheritanceViaPrototype.html<br> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"<br> <nowiki>"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"></nowiki><br> <nowiki><html xmlns="http://www.w3.org/1999/xhtml"></nowiki><br> <head><br> <title>JavaScript Inheritance via Prototype</title><br> <script type="text/javascript" src="inheritanceViaPrototype.js"></script><br> <script type="text/javaScript"><br> function describe(vehicle) {<br> var description = "";<br> description = description + "Number of wheels: " + vehicle.wheelCount;<br> description = description + "\n\nCurb Weight: " + vehicle.curbWeightInPounds;<br> description = description + "\n\nRefueling Method: " + vehicle.refuel();<br> description = description + "\n\nMain Tasks: " + vehicle.mainTasks();<br> alert(description);<br> }<br> function createVehicle() {<br> var vehicle = new Vehicle();<br> describe(vehicle);<br> }<br> function createSportsCar() {<br> var sportsCar = new SportsCar();<br> describe(sportsCar);<br> }<br> function createCementTruck() {<br> var cementTruck = new CementTruck();<br> describe(cementTruck);<br> }<br> </script><br> </head><br> <body><br> <nowiki> <h1>Examples of JavaScript Inheritance via the Prototype Method</h1></nowiki><br> <nowiki><br/><br/></nowiki><br> <nowiki><button onclick="createVehicle();">Create an instance of Vehicle</button></nowiki><br> <nowiki><br/><br/></nowiki><br> <nowiki><button onclick="createSportsCar();">Create an instance of SportsCar</button></nowiki><br> <nowiki><br/><br/></nowiki><br> <nowiki><button onclick="createCementTruck();">Create an instance of CementTruck</button></nowiki><br> </body><br> </html><br> 分别创建3个对象,并用describe函数描述,结果如图5-16所示。<br> [[Image:image0160.jpg]] 图5-16 创建Vehicle、SportsCar和CementTruck 对象并使用describe函数分别描述的结果<br> [[category:Ajax]]
摘要:
请注意,您对站长百科的所有贡献都可能被其他贡献者编辑,修改或删除。如果您不希望您的文字被任意修改和再散布,请不要提交。
您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源(参阅
Wordpress-mediawiki:版权
的细节)。
未经许可,请勿提交受版权保护的作品!
取消
编辑帮助
(在新窗口中打开)
本页使用的模板:
模板:开发语言导航
(
编辑
)