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 相关文章推荐
jQuery 网易相册鼠标移动显示隐藏效果实现代码
Mar 31 Javascript
无闪烁更新网页内容JS实现
Dec 19 Javascript
两种不同的方法实现js对checkbox进行全选和反选
May 13 Javascript
jQuery实现form表单基于ajax无刷新提交方法详解
Dec 08 Javascript
JS检测window.open打开的窗口是否关闭
Jun 25 Javascript
three.js中文文档学习之创建场景
Nov 20 Javascript
在Vue项目中使用d3.js的实例代码
May 01 Javascript
webpack dll打包重复问题优化的解决
Oct 10 Javascript
vue使用pdfjs显示PDF可复制的实现方法
Dec 14 Javascript
bootstrap与pagehelper实现分页效果
Dec 29 Javascript
JS实现的简单tab切换功能完整示例
Jun 20 Javascript
微信小程序实现简单文字跑马灯
May 26 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 CURL模拟登录新浪微博抓取页面内容 基于EaglePHP框架开发
2012/01/16 PHP
php打造属于自己的MVC框架
2012/03/07 PHP
javascript some()函数用法详解
2014/11/13 PHP
PHP实现通过正则表达式替换回调的内容标签
2015/06/15 PHP
php写入txt乱码的解决方法
2019/09/17 PHP
HTML Dom与Css控制方法
2010/10/25 Javascript
jquery ajax学习笔记2 使用XMLHttpRequest对象的responseXML
2011/10/16 Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
2013/07/05 Javascript
判断在css加载完毕后执行后续代码示例
2014/09/03 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
2014/10/16 Javascript
JS+CSS实现下拉列表框美化效果(3款)
2015/08/15 Javascript
jquery实现楼层滚动效果
2018/01/01 jQuery
Vue单页面应用保证F5强刷不清空数据的解决方案
2018/01/31 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
操作按钮悬浮固定在微信小程序底部的实现代码
2019/08/02 Javascript
python实现简单购物商城
2016/05/21 Python
Django自定义认证方式用法示例
2017/06/23 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
2018/02/10 Python
Python3基于sax解析xml操作示例
2018/05/22 Python
Python3 安装PyQt5及exe打包图文教程
2019/01/08 Python
详解python中的生成器、迭代器、闭包、装饰器
2019/08/22 Python
python导入库的具体方法
2020/06/18 Python
Python3爬虫关于识别检验滑动验证码的实例
2020/07/30 Python
python实现经典排序算法的示例代码
2021/02/07 Python
html5使用Drag事件编辑器拖拽上传图片的示例代码
2017/08/22 HTML / CSS
详解HTML5常用的语义化标签
2019/09/27 HTML / CSS
幼儿教师思想汇报
2014/01/10 职场文书
一份婚庆公司创业计划书
2014/01/11 职场文书
2014年幼儿园元旦活动方案
2014/02/13 职场文书
交通安全标语
2014/06/06 职场文书
科学发展观演讲稿
2014/09/11 职场文书
房屋买卖授权委托书
2014/09/27 职场文书
简易离婚协议书(范本)
2014/10/25 职场文书
教师求职自荐信范文
2015/03/04 职场文书
幼儿园毕业典礼家长致辞
2015/07/29 职场文书
德生TECSUN S-2000使用手册文字版
2022/05/10 无线电