JS中prototype的用法实例分析


Posted in Javascript onMarch 19, 2015

本文实例讲述了JS中prototype的用法。分享给大家供大家参考。具体分析如下:

JS中的phototype是JS中比较难理解的一个部分
 
本文基于下面几个知识点:
 
1 原型法设计模式

在.Net中可以使用clone()来实现原型法
原型法的主要思想是,现在有1个类A,我想要创建一个类B,这个类是以A为原型的,并且能进行扩展。我们称B的原型为A。
 
2 javascript的方法可以分为三类:

a 类方法
b 对象方法
c 原型方法

例子如下:

function People(name)
{
 this.name=name;
 //对象方法
 this.Introduce=function(){
  alert("My name is "+this.name);
 }
}
//类方法
People.Run=function(){
 alert("I can run");
}
//原型方法
People.prototype.IntroduceChinese=function(){
 alert("我的名字是"+this.name);
}
//测试
var p1=new People("Windking");
p1.Introduce();
People.Run();
p1.IntroduceChinese();

3 obj1.func.call(obj)方法

意思是将obj看成obj1,调用func方法

好了,下面一个一个问题解决:

prototype是什么含义?

javascript中的每个对象都有prototype属性,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用。

A.prototype = new B();

理解prototype不应把它和继承混淆。A的prototype为B的一个实例,可以理解A将B中的方法和属性全部克隆了一遍。A能使用B的方法和属性。这里强调的是克隆而不是继承。可以出现这种情况:A的prototype是B的实例,同时B的prototype也是A的实例。
 
先看一个实验的例子:

function baseClass()
{
 this.showMsg = function()
 {
   alert("baseClass::showMsg");  
 }
}
function extendClass()
{
}
extendClass.prototype = new baseClass();
var instance = new extendClass();
instance.showMsg(); // 显示baseClass::showMsg

我们首先定义了baseClass类,然后我们要定义extentClass,但是我们打算以baseClass的一个实例为原型,来克隆的extendClass也同时包含showMsg这个对象方法。

extendClass.prototype = new baseClass()就可以阅读为:extendClass是以baseClass的一个实例为原型克隆创建的。
 
那么就会有一个问题,如果extendClass中本身包含有一个与baseClass的方法同名的方法会怎么样?

下面是扩展实验2:

function baseClass()
{
  this.showMsg = function()
  {
    alert("baseClass::showMsg");  
  }
}
function extendClass()
{
  this.showMsg =function ()
  {
    alert("extendClass::showMsg");
  }
}
extendClass.prototype = new baseClass();
var instance = new extendClass();
instance.showMsg();//显示extendClass::showMsg

实验证明:函数运行时会先去本体的函数中去找,如果找到则运行,找不到则去prototype中寻找函数。或者可以理解为prototype不会克隆同名函数。
 
那么又会有一个新的问题:

如果我想使用extendClass的一个实例instance调用baseClass的对象方法showMsg怎么办?
 
答案是可以使用call:

extendClass.prototype = new baseClass();
var instance = new extendClass();
var baseinstance = new baseClass();
baseinstance.showMsg.call(instance);//显示baseClass::showMsg

这里的baseinstance.showMsg.call(instance);阅读为“将instance当做baseinstance来调用,调用它的对象方法showMsg”
好了,这里可能有人会问,为什么不用baseClass.showMsg.call(instance);
这就是对象方法和类方法的区别,我们想调用的是baseClass的对象方法
 
最后,下面这个代码如果理解清晰,那么这篇文章说的就已经理解了:

<script type="text/javascript">
function baseClass()
{
  this.showMsg = function()
  {
    alert("baseClass::showMsg");  
  }
  this.baseShowMsg = function()
  {
    alert("baseClass::baseShowMsg");
  }
}
baseClass.showMsg = function()
{
  alert("baseClass::showMsg static");
}
function extendClass()
{
  this.showMsg =function ()
  {
    alert("extendClass::showMsg");
  }
}
extendClass.showMsg = function()
{
  alert("extendClass::showMsg static")
}
extendClass.prototype = new baseClass();
var instance = new extendClass();
instance.showMsg(); //显示extendClass::showMsg
instance.baseShowMsg(); //显示baseClass::baseShowMsg
instance.showMsg(); //显示extendClass::showMsg
baseClass.showMsg.call(instance);//显示baseClass::showMsg static
var baseinstance = new baseClass();
baseinstance.showMsg.call(instance);//显示baseClass::showMsg
</script>

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
基于jQuery实现简单的折叠菜单效果
Nov 23 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
Dec 07 Javascript
AngularJs bootstrap搭载前台框架——准备工作
Sep 01 Javascript
jQuery实现的导航下拉菜单效果示例
Sep 05 Javascript
jQuery实现ToolTip元素定位显示功能示例
Nov 23 Javascript
JavaScript易错知识点整理
Dec 05 Javascript
js数组去重的hash方法
Dec 22 Javascript
bootstrap 点击空白处popover弹出框隐藏实例
Jan 24 Javascript
vue-router懒加载速度缓慢问题及解决方法
Nov 25 Javascript
微信小程序实现获取准确的腾讯定位地址功能示例
Mar 27 Javascript
jQuery 淡入/淡出效果函数用法分析
May 19 jQuery
layui实现显示数据表格、搜索和修改功能示例
Jun 03 Javascript
JS获取Table中td值的方法
Mar 19 #Javascript
JavaScript使用yield模拟多线程的方法
Mar 19 #Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
Mar 19 #Javascript
JavaScript数组随机排列实现随机洗牌功能
Mar 19 #Javascript
JavaScript生成随机字符串的方法
Mar 19 #Javascript
JavaScript函数参数使用带参数名的方式赋值传入的方法
Mar 19 #Javascript
JavaScript通过字典进行字符串翻译转换的方法
Mar 19 #Javascript
You might like
php创建多级目录代码
2008/06/05 PHP
PHP 简单日历实现代码
2009/10/28 PHP
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
2013/06/20 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
2015/02/10 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
2015/04/27 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
用js统计用户下载网页所需时间的脚本
2008/10/15 Javascript
Jquery下判断Id是否存在的代码
2011/01/06 Javascript
导航跟随滚动条置顶移动示例代码
2013/09/11 Javascript
jquery mobile 移动web(5)
2015/12/20 Javascript
Javascript之String对象详解
2016/06/08 Javascript
bootstrapValidator 重新启用提交按钮的方法
2017/02/20 Javascript
解决html-jquery/js引用外部图片时遇到看不了或出现403的问题
2017/09/22 jQuery
JavaScript实现二叉树的先序、中序及后序遍历方法详解
2017/10/26 Javascript
vue中axios请求的封装实例代码
2019/03/23 Javascript
解决Vue+Electron下Vuex的Dispatch没有效果问题
2019/05/20 Javascript
利用原生JS实现data方法示例代码
2019/05/28 Javascript
javascript实现留言板功能
2020/02/08 Javascript
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
Python 性能优化技巧总结
2016/11/01 Python
Python3批量生成带logo的二维码方法
2019/06/24 Python
python创建学生管理系统
2019/11/22 Python
DataFrame.to_excel多次写入不同Sheet的实例
2019/12/02 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
2019/12/23 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
2020/03/10 Python
Python unittest单元测试框架实现参数化
2020/04/29 Python
python 线程的五个状态
2020/09/22 Python
佳能德国网上商店:Canon德国
2017/03/18 全球购物
西班牙用户之间买卖视频游戏的平台:Wakkap
2020/03/21 全球购物
通信工程专业毕业生推荐信
2013/12/25 职场文书
西式结婚主持词
2014/03/14 职场文书
乡镇三严三实学习心得体会
2014/10/13 职场文书
2015年党风廉政建设工作总结
2015/04/09 职场文书
创业计划书之婴幼儿游泳馆
2019/09/11 职场文书
js基础语法与maven项目配置教程案例
2021/07/15 Javascript
基于Android10渲染Surface的创建过程
2022/08/14 Java/Android