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 相关文章推荐
JavaScript中的排序算法代码
Feb 22 Javascript
如何确保JavaScript的执行顺序 之实战篇
Mar 03 Javascript
浅谈 jQuery 事件源码定位问题
Jun 18 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
Nov 26 Javascript
基于JavaScript实现类似于百度学术高级检索功能
Mar 02 Javascript
实践中学习AngularJS表单
Mar 21 Javascript
纯JS实现表单验证实例
Dec 24 Javascript
JavaScript中的ES6 Proxy的具体使用
Jun 16 Javascript
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
Jul 03 jQuery
Vue 实例事件简单示例
Sep 19 Javascript
js实现搜索提示框效果
Sep 05 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
Dec 19 Vue.js
详解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多线程抓取网页实现代码
2010/07/22 PHP
Laravel5.1自定义500错误页面示例
2016/10/09 PHP
php获取开始与结束日期之间所有日期的方法
2016/11/29 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
2017/02/15 PHP
thinkPHP通用控制器实现方法示例
2017/11/23 PHP
Laravel框架集合用法实例浅析
2020/05/14 PHP
js 使用form表单select类实现级联菜单效果
2012/12/19 Javascript
解决JS浮点数运算出现Bug的方法
2013/03/12 Javascript
js/jquery去掉空格,回车,换行示例代码
2013/11/05 Javascript
js 弹出新页面避免被浏览器、ad拦截的一种新方法
2014/04/30 Javascript
简单的js表格操作
2016/09/24 Javascript
AngularJS 与百度地图的结合实例
2016/10/20 Javascript
easyui tree带checkbox实现单选的简单实例
2016/11/07 Javascript
JS实现的表头列头固定页面功能示例
2017/01/10 Javascript
详解nodeJS之路径PATH模块
2017/05/31 NodeJs
javascript帧动画(实例讲解)
2017/09/02 Javascript
深入浅析AngularJs模版与v-bind
2018/07/06 Javascript
vue中实现上传文件给后台实例详解
2019/08/22 Javascript
p5.js绘制创意自画像
2019/11/04 Javascript
JS+CSS实现3D切割轮播图
2020/03/21 Javascript
vue实现移动端input上传视频、音频
2020/08/18 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
Python Deque 模块使用详解
2014/07/04 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
2016/06/29 Python
Django+Xadmin构建项目的方法步骤
2019/03/06 Python
Python 使用多属性来进行排序
2019/09/01 Python
python线程安全及多进程多线程实现方法详解
2019/09/27 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
2019/12/30 Python
python剪切视频与合并视频的实现
2020/03/03 Python
定义css设备类型-Media Queries图表简介及使用方法
2013/01/21 HTML / CSS
高级Java程序员面试题
2016/06/23 面试题
国贸专业个人求职信范文
2014/01/08 职场文书
期中考试反思800字
2014/05/01 职场文书
2014年国庆节演讲稿
2014/09/19 职场文书
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
2021/05/25 MySQL