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内置的AJAX功能和JSON的使用实例
Jul 27 Javascript
jQuery中insertBefore()方法用法实例
Jan 08 Javascript
Javascript中的方法链(Method Chaining)介绍
Mar 15 Javascript
基于RequireJS和JQuery的模块化编程——常见问题全面解析
Apr 14 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
Jun 29 Javascript
浅谈javascript的闭包
Jan 23 Javascript
关于Vue单页面骨架屏实践记录
Dec 13 Javascript
Vue二次封装axios为插件使用详解
May 21 Javascript
webpack公共组件引用路径简化小技巧
Jun 15 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
Jun 29 Javascript
Vue核心概念Action的总结
Jan 18 Javascript
js常用正则表达式集锦
May 17 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
ajax php传递和接收变量实现思路及代码
2012/12/19 PHP
解析如何屏蔽php中的phpinfo()函数
2013/06/06 PHP
PHP删除数组中空值的方法介绍
2014/04/14 PHP
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
PHP生成word文档的三种实现方式
2016/11/14 PHP
JS面向对象编程之对象使用分析
2010/08/19 Javascript
用dtree实现树形菜单 dtree使用说明
2011/10/17 Javascript
onkeypress字符按键兼容所有浏览器使用介绍
2013/04/24 Javascript
javascript实现的网站访问量统计代码
2015/12/20 Javascript
Document.body.scrollTop的值总为零的快速解决办法
2016/06/09 Javascript
JS动态给对象添加属性和值的实现方法
2016/10/21 Javascript
JavaScript Ajax实现异步通信
2016/12/14 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
Javascript中 带名 匿名 箭头函数的重要区别(推荐)
2017/01/29 Javascript
JavaScript中this用法学习笔记
2019/03/17 Javascript
JS数组方法reduce的用法实例分析
2020/03/03 Javascript
vue 动态给每个页面添加title、关键词和描述的方法
2020/08/28 Javascript
JavaScript实现alert弹框效果
2020/11/19 Javascript
[01:32]TI奖金增速竟因它再创新高!DOTA2勇士令状不朽珍藏Ⅰ饰品欣赏
2018/05/18 DOTA
在漏洞利用Python代码真的很爽
2007/08/26 Python
Python os模块介绍
2014/11/30 Python
用Python实现斐波那契(Fibonacci)函数
2016/03/25 Python
Python三级目录展示的实现方法
2016/09/28 Python
python 以16进制打印输出的方法
2018/07/09 Python
python提取log文件内容并画出图表
2019/07/08 Python
使用keras根据层名称来初始化网络
2020/05/21 Python
Python数据可视化常用4大绘图库原理详解
2020/10/23 Python
详解HTML5通讯录获取指定多个人的信息
2016/12/20 HTML / CSS
使用Html5中的cavas画一面国旗
2019/09/25 HTML / CSS
美国销售第一的智能手机和平板电脑保护壳:OtterBox
2017/12/21 全球购物
June Jacobs尊积帕官网:知名的spa水疗护肤品牌
2019/03/21 全球购物
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
《长相思》听课反思
2014/04/10 职场文书
2014年营业员工作总结
2014/11/18 职场文书
python爬取豆瓣电影TOP250数据
2021/05/23 Python
使用pandas生成/读取csv文件的方法实例
2021/07/09 Python