Javascript中prototype的使用详解


Posted in Javascript onJune 18, 2016

先看下面一段代码:

function Machine(ecode, horsepower) {
  this.ecode = ecode;
  this.horsepower = horsepower;
}

function showme() {
  alert(this.name + " " + this.ecode + " " + this.horsepower);
}

var machine = new Machine("code1", 15);
machine.name = "machine1";
machine.showme = showme;
machine.showme();

这样一段代码,虽然建立了一个Machine对象后,通过machine.showme = showme;使得showme函数变成了Machine对象machine的方法。

但是,就看上面两个函数(一个是对象的构造函数,一个是普通方法)没有任何关系,这样的代码,不是那么“优雅“,因此,便有了prototype。

//机器
function Machine(ecode, horsepower) {
  this.ecode = ecode;
  this.horsepower = horsepower;
}
//特别注意这一句,Machine.prototype是第一次初始化的时候就初始化好的,
//当调用Machine作为构造函数的时候,engine的值不会再改变
Machine.prototype.engine = this.ecode + " " + this.horsepower;
Machine.prototype.showme = function () { alert(this.name + " " + this.ecode + " " + this.horsepower); }

利用以上代码,所有的Machine对象就有了showme方法了。

但是要特别注意:

prototype只是面对实例的,而不是面对类对象的。(js中,类本身就是一个对象)所以Machine.showme();会报错误,因为Machine这个对象是没有showme方法的。

那么,我们怎么使用showme方法呢?必须得新建一个Machine实例,只有Machine实例才会有这个方法。

var machine = new Machine("code1", 15);
machine.name = "machine1";
machine.showme(); //输出machine1 code1 15。

有了prototype之后,我们更加容易实现继承关系。比如我现在写一个Car类,需要继承目前这个Machine类,只需要写如下代码即可:

//小汽车
function Car(name, ecode, horsepower) {
  this.name = name;
  //调用父类的构造函数,使得Car的对象有ecode、horsepower属性
  Machine.call(this, ecode, horsepower);
}
//Car的原型指向Machine,使Car对象有Machine原型的任意属性和方法,比如showme
Car.prototype = new Machine();

这里如何调用父构造函数,以及如何获得父类的原型,注释的都很清楚,就不在赘述了。

然后,我们可以新建一个对象测试一下:

//新建一个类Car的对象。
var xiali = new Car("xiali", "aaa", 15);
alert(xiali.engine);
xiali.showme();

以上,是prototype的基本应用,但是也是prototype的最主要的应用。

掌握的prototype的使用,在以后的过程中,对于对象的构建和继承,会有更深层次的理解。

查看更多JavaScript的语法,大家可以关注:《JavaScript 参考教程》、《JavaScript代码风格指南》,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript XML实现两级级联下拉列表
Nov 10 Javascript
获取鼠标在div中的相对位置的实现代码
Dec 30 Javascript
比例尺、缩略图、平移缩放之百度地图添加控件方法
Aug 03 Javascript
js实现鼠标点击文本框自动选中内容的方法
Aug 20 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
Dec 04 Javascript
微信小程序 数据遍历的实现
Apr 05 Javascript
详解Node项目部署到云服务器上
Jul 12 Javascript
利用js将ajax获取到的后台数据动态加载至网页中的方法
Aug 08 Javascript
微信小程序内拖动图片实现移动、放大、旋转的方法
Sep 04 Javascript
Node.js 实现抢票小工具 & 短信通知提醒功能
Oct 22 Javascript
VUE 实现element upload上传图片到阿里云
Aug 12 Javascript
JavaScript async/await原理及实例解析
Dec 02 Javascript
jQuery无刷新上传之uploadify3.1简单使用
Jun 18 #Javascript
jQuery插件uploadify实现ajax效果的图片上传
Jun 18 #Javascript
JavaScript的this关键字的理解
Jun 18 #Javascript
jquery+ajax实现直接提交表单实例分析
Jun 17 #Javascript
jQuery UI Bootstrap是什么?
Jun 17 #Javascript
JS模拟bootstrap下拉菜单效果实例
Jun 17 #Javascript
JavaScript获取当前url根目录(路径)
Jun 17 #Javascript
You might like
php 远程图片保存到本地的函数类
2008/12/08 PHP
PHP 程序员也要学会使用“异常”
2009/06/16 PHP
php中mysql模块部分功能的简单封装
2011/09/30 PHP
php数组去除空值函数分享
2015/02/02 PHP
php实现用于验证所有类型的信用卡类
2015/03/24 PHP
Yii使用DeleteAll连表删除出现报错问题的解决方法
2016/07/14 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
基于jquery的页面划词搜索JS
2010/09/14 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
2014/09/26 NodeJs
jquery实现公告翻滚效果
2015/02/27 Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
2015/09/22 Javascript
js实现图片无缝滚动特效
2020/03/19 Javascript
html+js+highcharts绘制圆饼图表的简单实例
2016/08/04 Javascript
详谈jQuery Ajax(load,post,get,ajax)的用法
2017/03/02 Javascript
原生JS实现导航下拉菜单效果
2020/11/25 Javascript
JavaScript树的深度优先遍历和广度优先遍历算法示例
2018/07/30 Javascript
Angular异步变同步处理方法
2018/08/13 Javascript
JS调用安卓手机摄像头扫描二维码
2018/10/16 Javascript
React SSR样式及SEO的实践
2018/10/22 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
2019/01/09 jQuery
在 Vue.js中优雅地使用全局事件的方法
2019/02/01 Javascript
Vue实现一个图片懒加载插件
2019/03/11 Javascript
详解JWT token心得与使用实例
2019/08/02 Javascript
深入了解JavaScript 防抖和节流
2019/09/12 Javascript
js实现飞机大战游戏
2020/08/26 Javascript
了解不常见但是实用的Python技巧
2019/05/23 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
2020/06/23 Python
实习心得体会
2014/01/02 职场文书
管事部库房保管员岗位职责
2014/02/21 职场文书
《雪儿》教学反思
2014/04/17 职场文书
党员干部群众路线个人整改措施
2014/09/18 职场文书
MySQL 全文检索的使用示例
2021/06/07 MySQL
MySQL Server层四个日志的实现
2022/03/31 MySQL
德生BCL3000抢先使用感受和评价
2022/04/07 无线电