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 相关文章推荐
dreamweaver 安装Jquery智能提示
Apr 02 Javascript
js判断客户端是iOS还是Android等移动终端的方法
Dec 11 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
Jun 30 Javascript
javascript函数命名的三种方式及区别介绍
Mar 22 Javascript
JavaScript 数组中最大最小值
Jun 05 Javascript
webpack构建react多页面应用详解
Sep 15 Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
Aug 03 jQuery
vue中使用axios post上传头像/图片并实时显示到页面的方法
Sep 27 Javascript
详解Vue路由自动注入实践
Apr 17 Javascript
微信小程序开发之转发分享功能
Oct 22 Javascript
vue实现全屏滚动效果(非fullpage.js)
Mar 07 Javascript
Vue触发input选取文件点击事件操作
Aug 07 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
fgetcvs在linux的问题
2012/01/15 PHP
PHP变量赋值、代入给JavaScript中的变量
2015/06/29 PHP
分析php://output和php://stdout的区别
2018/05/06 PHP
php文件包含的几种方式总结
2019/09/19 PHP
javascript正则表达式中参数g(全局)的作用
2010/11/11 Javascript
JavaScript中两个感叹号的作用说明
2011/12/28 Javascript
js中生成map对象的方法
2014/01/09 Javascript
jquery ajax 局部无刷新更新数据的实现案例
2014/02/08 Javascript
javascript读写json示例
2014/04/11 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
jQuery实现平滑滚动的标签分栏切换效果
2015/08/28 Javascript
AngularJS  ng-repeat遍历输出的用法
2017/06/19 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
2018/11/30 Javascript
Vue中使用matomo进行访问流量统计的实现
2019/11/05 Javascript
jQuery Raty星级评分插件使用方法实例分析
2019/11/25 jQuery
JS数组属性去重并校验重复数据
2020/01/10 Javascript
js中复选框的取值及赋值示例详解
2020/10/18 Javascript
Python实现简单的可逆加密程序实例
2015/03/05 Python
python创建临时文件夹的方法
2015/07/06 Python
使用Python解析JSON数据的基本方法
2015/10/15 Python
Python中json格式数据的编码与解码方法详解
2016/07/01 Python
django+echart绘制曲线图的方法示例
2018/11/26 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
基于python实现获取网页图片过程解析
2020/05/11 Python
MAC平台基于Python Appium环境搭建过程图解
2020/08/13 Python
HTML5+WebSocket实现多文件同时上传的实例
2016/12/29 HTML / CSS
欧洲高端品牌直销店:Fashionesta
2016/08/31 全球购物
美国在线家装零售商:Build.com
2016/09/02 全球购物
全球最大的房车租赁市场:Outdoorsy
2018/09/19 全球购物
工程现场管理求职自荐信
2013/10/02 职场文书
总经理助理的职责
2014/03/14 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
个人剖析材料范文
2014/09/30 职场文书
个人委托书范文
2015/01/28 职场文书
Go语言 详解net的tcp服务
2022/04/14 Golang
python双向链表实例详解
2022/05/25 Python