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 相关文章推荐
javascript 打印内容方法小结
Nov 04 Javascript
表格 隔行换色升级版
Nov 07 Javascript
JavaScript中伪协议 javascript:使用探讨
Jul 18 Javascript
JS中实现简单Formatter函数示例代码
Aug 19 Javascript
JavaScript拆分字符串时产生空字符的解决方案
Sep 26 Javascript
你有必要知道的25个JavaScript面试题
Dec 29 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
Oct 10 Javascript
js控制台输出的方法(详解)
Nov 26 Javascript
AngularJS执行流程详解
Feb 17 Javascript
vue.js指令和组件详细介绍及实例
Apr 06 Javascript
vue防止花括号{{}}闪烁v-text和v-html、v-cloak用法示例
Mar 13 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
Mar 09 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/14 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
2014/05/08 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
js+php实现静态页面实时调用用户登陆状态的方法
2015/01/04 PHP
php解析http获取的json字符串变量总是空白null
2015/03/02 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
Prototype PeriodicalExecuter对象 学习
2009/07/19 Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
2011/04/07 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
Jquery+asp.net后台数据传到前台js进行解析的方法
2014/05/11 Javascript
JS简单限制textarea内输入字符数量的方法
2015/10/14 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
2015/11/26 Javascript
jQuery中hover与mouseover和mouseout的区别分析
2015/12/24 Javascript
jQuery实现产品对比功能附源码下载
2016/08/09 Javascript
AngularJS 自定义过滤器详解及实例代码
2016/09/14 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
vue实现点击选中,其他的不选中方法
2018/09/05 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
微信小程序实现购物页面左右联动
2019/02/15 Javascript
jQuery实现移动端扭蛋机抽奖
2020/11/08 jQuery
Python中字典的基本知识初步介绍
2015/05/21 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
python加载自定义词典实例
2019/12/06 Python
Python双链表原理与实现方法详解
2020/02/22 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
日本钓鱼渔具和户外用品网上商店:naturum
2016/08/07 全球购物
奥地利票务门户网站:oeticket.com
2019/12/31 全球购物
社会保险接收函
2014/01/12 职场文书
经济管理专业求职信
2014/06/09 职场文书
优秀共产党员主要事迹材料
2015/11/05 职场文书
2016年教师反腐倡廉心得体会
2016/01/13 职场文书
python数字转对应中文的方法总结
2021/08/02 Python