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 相关文章推荐
jQueryUI写一个调整分类的拖放效果实现代码
May 10 Javascript
js获取dom的高度和宽度(可见区域及部分等等)
Jun 13 Javascript
jQuery中eq()方法用法实例
Jan 05 Javascript
Ext JS动态加载JavaScript创建窗体的方法
Jun 23 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
Dec 13 Javascript
利用Angularjs中模块ui-route管理状态的方法
Dec 27 Javascript
jquery实现图片平滑滚动详解
Mar 22 jQuery
详解微信小程序 相对定位和绝对定位
May 11 Javascript
详解webpack与SPA实践之开发环境搭建
Dec 18 Javascript
JS查找孩子节点简单示例
Jul 25 Javascript
JS一次前端面试经历记录
Mar 19 Javascript
浅谈js中的attributes和Attribute的用法与区别
Jul 16 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音乐采集(部分代码)
2007/02/14 PHP
mysql 搜索之简单应用
2007/04/27 PHP
完美解决PHP中文乱码
2009/11/26 PHP
Windows下XDebug 手工配置与使用说明
2010/07/11 PHP
解析PHP生成静态html文件的三种方法
2013/06/18 PHP
php上传文件,创建递归目录的实例代码
2013/10/18 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
2014/08/06 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
php获取网站百度快照日期的方法
2015/07/29 PHP
PHP中SQL查询语句的id=%d解释(推荐)
2016/12/10 PHP
javascript+xml技术实现分页浏览
2008/07/27 Javascript
用JQuery 判断某个属性是否存在hasAttr的解决方法
2013/04/26 Javascript
javascript 实现 秒杀,团购 倒计时展示的记录 分享
2013/07/12 Javascript
JQuery插件iScroll实现下拉刷新,滚动翻页特效
2014/06/22 Javascript
js中键盘事件实例简析
2015/01/10 Javascript
javascript中scrollTop详解
2015/04/13 Javascript
js组件SlotMachine实现图片切换效果制作抽奖系统
2016/04/17 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
ES6中数组array新增方法实例总结
2017/11/07 Javascript
python中使用urllib2伪造HTTP报头的2个方法
2014/07/07 Python
Python中一些自然语言工具的使用的入门教程
2015/04/13 Python
python flask实现分页效果
2017/06/27 Python
python基于ID3思想的决策树
2018/01/03 Python
Python安装图文教程 Pycharm安装教程
2018/03/27 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
2019/08/30 Python
python的scipy实现插值的示例代码
2019/11/12 Python
Python TCP通信客户端服务端代码实例
2019/11/21 Python
python shutil文件操作工具使用实例分析
2019/12/25 Python
HTML利用九宫格原理进行网页布局
2020/03/13 HTML / CSS
财务部岗位职责
2013/11/19 职场文书
学院书画协会部门岗位职责
2013/12/01 职场文书
公司离职证明范本
2014/01/13 职场文书
公证委托书大全
2014/04/04 职场文书
优秀学生评语大全
2014/04/25 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
恶魔之树最顶端的三颗果实 震震果实上榜,第一可以制造岩浆
2022/03/18 日漫