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 相关文章推荐
xtree.js 代码
Mar 13 Javascript
Jquery的hover方法让鼠标经过li时背景变色
Sep 06 Javascript
JQuery右键菜单插件ContextMenu使用指南
Dec 19 Javascript
js实现Select下拉框具有输入功能的方法
Feb 06 Javascript
JavaScript自定义数组排序方法
Feb 12 Javascript
7个去伪存真的JavaScript面试题
Jan 07 Javascript
JavaScript中 ES6 generator数据类型详解
Aug 11 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
Nov 16 Javascript
如何防止INPUT按回车自动提交表单FORM
Dec 06 Javascript
vue编译打包本地查看index文件的方法
Feb 23 Javascript
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
Aug 01 Javascript
基于Vue el-autocomplete 实现类似百度搜索框功能
Oct 25 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 intval的测试代码发现问题
2008/07/27 PHP
php数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
php 过滤器实现代码
2010/08/09 PHP
深入理解PHP原理之异常机制
2010/08/21 PHP
php异常处理捕获错误整理
2019/09/23 PHP
写入cookie的JavaScript代码库 cookieLibrary.js
2009/10/24 Javascript
Chrome中模态对话框showModalDialog返回值问题的解决方法
2010/05/25 Javascript
Jquery工作常用实例 使用AJAX使网页进行异步更新
2011/07/26 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
2014/06/23 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
微信jssdk在iframe页面失效问题的解决措施
2016/03/03 Javascript
JS+CSS实现的漂亮渐变背景特效代码(6个渐变效果)
2016/03/25 Javascript
基于Angularjs实现分页功能
2016/05/30 Javascript
从vue源码看props的用法
2019/01/09 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
2019/12/16 Javascript
[01:06:18]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第二场 1月26日
2021/03/11 DOTA
跟老齐学Python之for循环语句
2014/10/02 Python
为python设置socket代理的方法
2015/01/14 Python
python使用xmlrpclib模块实现对百度google的ping功能
2015/06/02 Python
在Linux系统上安装Python的Scrapy框架的教程
2015/06/11 Python
总结Python编程中函数的使用要点
2016/03/20 Python
Python实现自动发送邮件功能
2021/03/02 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
pytorch 模型可视化的例子
2019/08/17 Python
Python爬虫HTPP请求方法有哪些
2020/06/03 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
2020/07/02 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
使用html5制作loading图的示例
2014/04/14 HTML / CSS
美国在线乐器和设备商店:Musician’s Friend
2018/07/06 全球购物
德国排名第一的主题公园门票网站:Attraction Tickets Direct
2019/09/09 全球购物
揭牌仪式主持词
2014/03/19 职场文书
食品流通安全承诺书
2014/05/22 职场文书
Python并发编程实例教程之线程的玩法
2021/06/20 Python