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 相关文章推荐
解决 firefox 不支持 document.all的方法
Mar 12 Javascript
在父页面调用子页面的JS方法
Sep 29 Javascript
JavaScript如何禁止Backspace键
Dec 02 Javascript
浅谈Angularjs link和compile的使用区别
Oct 21 Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
Jun 25 Javascript
JS中Attr的用法详解
Oct 09 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
Oct 31 Javascript
vue-cli2.9.3 详细教程
Apr 23 Javascript
vue.js做一个简单的编辑菜谱功能
May 08 Javascript
JS实现统计字符串中字符出现个数及最大个数功能示例
Jun 04 Javascript
记一次Vue.js混入mixin的使用(分权限管理页面)
Apr 17 Javascript
Javascript异步编程async实现过程详解
Apr 02 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
BBS(php &amp; mysql)完整版(八)
2006/10/09 PHP
PHP浮点数精度问题汇总
2015/05/13 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
Laravel框架搜索分页功能示例
2019/02/01 PHP
用js实现控制内容的向上向下滚动效果
2007/06/26 Javascript
跟着Jquery API学Jquery之一 选择器
2010/04/07 Javascript
单击复制文字兼容各浏览器的完美解决方案
2013/07/04 Javascript
基于jquery实现的省市区级联无ajax
2013/09/24 Javascript
在JavaScript中处理字符串之link()方法的使用
2015/06/08 Javascript
使用jquery实现仿百度自动补全特效
2015/07/23 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
2016/05/10 Javascript
JavaScript作用域示例详解
2016/07/07 Javascript
微信小程序链接传参并跳转新页面
2016/11/29 Javascript
JS回调函数基本定义与用法实例分析
2017/05/24 Javascript
vue+swiper实现组件化开发的实例代码
2017/10/26 Javascript
element的el-table中记录滚动条位置的示例代码
2019/11/06 Javascript
vue页面更新patch的实现示例
2020/03/25 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
纯js+css实现在线时钟
2020/08/18 Javascript
Python与shell的3种交互方式介绍
2015/04/11 Python
Python中转换角度为弧度的radians()方法
2015/05/18 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
Python实现深度遍历和广度遍历的方法
2019/01/22 Python
Python如何爬取实时变化的WebSocket数据的方法
2019/03/09 Python
Python 用turtle实现用正方形画圆的例子
2019/11/21 Python
pytorch:实现简单的GAN示例(MNIST数据集)
2020/01/10 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
2020/06/09 Python
Lululemon加拿大官网:加拿大知名体育服装零售商
2019/04/12 全球购物
化学教学随笔感言
2014/02/19 职场文书
学校领导四风问题整改措施思想汇报
2014/10/09 职场文书
物业工程部主管岗位职责
2015/04/16 职场文书
投标售后服务承诺书
2015/04/29 职场文书
《花钟》教学反思
2016/02/17 职场文书
公司周年庆寄语
2019/06/21 职场文书
解决xampp安装后Apache无法启动
2022/03/21 Servers
前端canvas中物体边框和控制点的实现示例
2022/08/05 Javascript