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 相关文章推荐
动态控制Table的js代码
Mar 07 Javascript
用JavaScript实现单继承和多继承的简单方法
Mar 29 Javascript
基于Jquery的温度计动画效果
Jun 18 Javascript
AngularJS快速入门
Apr 02 Javascript
跟我学习javascript的最新标准ES6
Nov 20 Javascript
js操作浏览器的参数方法
Jan 21 Javascript
Vue+Vux项目实践完整代码
Nov 30 Javascript
JS实现图片拖拽交换效果
Nov 30 Javascript
深入探索VueJS Scoped CSS 实现原理
Sep 23 Javascript
Vue实现导航栏的显示开关控制
Nov 01 Javascript
JavaScript this关键字的深入详解
Jan 14 Javascript
vue实现列表垂直无缝滚动
Apr 08 Vue.js
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边学边教》(02.Apache+PHP环境配置――上篇)
2006/12/13 PHP
超强分页类2.0发布,支持自定义风格,默认4种显示模式
2007/01/02 PHP
用mysql内存表来代替php session的类
2009/02/01 PHP
PHP 编写的 25个游戏脚本
2009/05/11 PHP
php利用ffmpeg提取视频中音频与视频画面的方法详解
2017/06/07 PHP
ie和firefox中img对象区别的困惑
2006/12/27 Javascript
Javascript学习笔记6 prototype的提出
2010/01/11 Javascript
jquery 跨域访问问题解决方法(笔记)
2011/06/08 Javascript
Jquery 数据选择插件Pickerbox使用介绍
2012/08/24 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
2013/09/29 Javascript
原生js仿jquery animate动画效果
2016/07/13 Javascript
jQuery EasyUI 右键菜单--关闭标签/选项卡的简单实例
2016/10/10 Javascript
jQuery实现发送验证码并60秒倒计时功能
2016/11/25 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
2016/12/01 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
小程序开发实战:实现九宫格界面的导航的代码实现
2017/01/19 Javascript
JQuery查找子元素find()和遍历集合each的方法总结
2017/03/07 Javascript
vue组件实现可搜索下拉框扩展
2020/10/23 Javascript
element-ui组件table实现自定义筛选功能的示例代码
2019/03/15 Javascript
浅谈vue加载优化策略
2019/03/19 Javascript
vue项目中锚点定位替代方式
2019/11/13 Javascript
vue使用echarts画组织结构图
2021/02/06 Vue.js
在Django的视图(View)外使用Session的方法
2015/07/23 Python
Python生成器以及应用实例解析
2018/02/08 Python
python3连接MySQL数据库实例详解
2018/05/24 Python
Python测试模块doctest使用解析
2019/08/10 Python
如何通过python实现人脸识别验证
2020/01/17 Python
python使用yaml 管理selenium元素的示例
2020/12/01 Python
EJB3.1都有哪些改进
2012/11/17 面试题
心得体会范文
2014/01/04 职场文书
2014年司法局工作总结
2014/12/11 职场文书
525心理健康活动总结
2015/05/08 职场文书
消防演习感想
2015/08/10 职场文书
Python insert() / append() 用法 Leetcode实战演示
2021/03/31 Python
MySQL索引篇之千万级数据实战测试
2021/04/05 MySQL