JS中的phototype详解


Posted in Javascript onFebruary 04, 2017

1 原型法设计模式

在.Net中可以使用clone()来实现原型法

原型法的主要思想是,现在有1个类A,我想要创建一个类B,这个类是以A为原型的,并且能进行扩展。我们称B的原型为A。

2 javascript的方法可以分为三类:

a 类方法

b 对象方法

c 原型方法

例子:

functionPeople(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=newPeople("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 相关文章推荐
JS启动应用程序的一个简单例子
May 11 Javascript
jQuery 自动增长的文本输入框实现代码
Apr 02 Javascript
基于jquery用于查询操作的实现代码
May 10 Javascript
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
May 30 Javascript
js 实现 input type=&quot;file&quot; 文件上传示例代码
Aug 07 Javascript
jQuery实现点击小图片淡入淡出显示大图片特效
Sep 09 Javascript
js实现显示手机号码效果
Mar 09 Javascript
es6学习笔记之Async函数的使用示例
May 11 Javascript
backbone简介_动力节点Java学院整理
Jul 14 Javascript
jQuery实现checkbox全选功能完整实例
Jul 12 jQuery
Javascript中Math.max和Math.max.apply的区别和用法详解
Aug 24 Javascript
axios封装与传参示例详解
Oct 18 Javascript
详解JavaScript RegExp对象
Feb 04 #Javascript
JS查找字符串中出现最多的字符及个数统计
Feb 04 #Javascript
JavaScript获取中英文混合字符串长度的方法示例
Feb 04 #Javascript
纯js模仿windows系统日历
Feb 04 #Javascript
canvas的神奇用法
Feb 03 #Javascript
Jquery实现跨域异步上传文件总结
Feb 03 #Javascript
js 递归和定时器的实例解析
Feb 03 #Javascript
You might like
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
2019/10/21 PHP
Avengerls vs Newbee BO3 第一场2.18
2021/03/10 DOTA
checkbox 复选框不能为空
2009/07/11 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
2013/04/28 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
AngularJS 中的Promise --- $q服务详解
2016/09/14 Javascript
element-ui使用导航栏跳转路由的用法详解
2018/08/22 Javascript
vue使用v-if v-show页面闪烁,div闪现的解决方法
2018/10/12 Javascript
JavaScript学习笔记之图片库案例分析
2019/01/08 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
2020/03/03 Javascript
JS加载解析Markdown文档过程详解
2020/05/19 Javascript
Vue项目打包部署到apache服务器的方法步骤
2021/02/01 Vue.js
[02:27]《DAC最前线》之附加赛征程
2015/01/29 DOTA
[05:20]2018DOTA2亚洲邀请赛主赛事第三日战况回顾 LGD率先挺进胜者组决赛
2018/04/06 DOTA
Python中字典的基础知识归纳小结
2015/08/19 Python
Python打造出适合自己的定制化Eclipse IDE
2016/03/02 Python
python3+PyQt5重新实现自定义数据拖放处理
2018/04/19 Python
Python操作mongodb数据库进行模糊查询操作示例
2018/06/09 Python
python3下载抖音视频的完整代码
2019/06/05 Python
使用Python实现文字转语音并生成wav文件的例子
2019/08/08 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
2020/01/03 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
2020/02/07 Python
Python turtle库的画笔控制说明
2020/06/28 Python
美国专营婴幼儿用品的购物网站:buybuy BABY
2017/01/01 全球购物
Staples英国官方网站:办公用品一站式采购
2017/10/06 全球购物
精选奢华:THE LIST
2019/09/05 全球购物
英国知名小木屋定制网站:Tiger Sheds
2020/03/06 全球购物
老教师工作总结的自我评价
2013/09/27 职场文书
护理专业的自荐信
2013/10/22 职场文书
《陋室铭》教学反思
2014/02/26 职场文书
群众路线专项整治方案
2014/10/27 职场文书
2014年语文教师工作总结
2014/12/18 职场文书
校园环境卫生倡议书
2015/04/29 职场文书
离婚律师函范本
2015/05/27 职场文书