javascript学习小结之prototype


Posted in Javascript onDecember 03, 2015

JS中的prototype是JS中比较难理解的一个部分

本文基于下面几个知识点:

1 原型法设计模式
在.Net中可以使用clone()来实现原型法

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

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

b -> 对象方法

c -> 原型方法

例子:

function People(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=new People("Windking");

p1.Introduce();//调用对象方法

People.Run();//调用静态方法

p1.IntroduceChinese(); //调用原型方法

3. obj1.func.call(obj)方法
意思是将obj看成obj1,调用func方法,本来调用的是obj1的func方法,但是,传入obj后,改变了上下文对象,就通过obj对象来调用ojb1的方法了

好了,下面一个一个问题解决:

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的对象方法

最后,下面这个代码如果理解清晰,那么这篇文章说的就已经理解了:

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

以上就是关于javascript中prototype的深入学习,之后还有相关文章进行更新,希望大家继续关注。

Javascript 相关文章推荐
Jquery 一次处理多个ajax请求的代码
Sep 02 Javascript
JQuery实现倒计时按钮具体方法
Nov 14 Javascript
Javscript调用iframe框架页面中函数的方法
Nov 01 Javascript
JS获得图片alt信息的方法
Apr 01 Javascript
jQuery实现简单下拉导航效果
Sep 07 Javascript
基于React.js实现原生js拖拽效果引发的思考
Mar 30 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
May 18 Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
Dec 20 Javascript
Node.Js生成比特币地址代码解析
Apr 21 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
Dec 15 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
Nov 04 Javascript
全面解析Vue中的$nextTick
Dec 24 Vue.js
简单实现JS对dom操作封装
Dec 02 #Javascript
jQuery实现获取绑定自定义事件元素的方法
Dec 02 #Javascript
JS折半插入排序算法实例
Dec 02 #Javascript
如何动态加载外部Javascript文件
Dec 02 #Javascript
javascript实现获取浏览器版本、浏览器类型
Dec 02 #Javascript
JavaScript如何禁止Backspace键
Dec 02 #Javascript
js文本框输入内容智能提示效果
Dec 02 #Javascript
You might like
第4章 数据处理-php数组的处理-郑阿奇
2011/07/04 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
用Javscript实现表单复选框的全选功能
2007/05/25 Javascript
js不能获取隐藏的div的宽度只能先显示后获取
2014/09/04 Javascript
jQuery实现的漂亮表单效果代码
2015/08/18 Javascript
AngularJS bootstrap启动详解及实例代码
2016/09/14 Javascript
nodejs简单实现操作arduino
2016/09/25 NodeJs
浅谈键盘上回车按钮的js触发事件
2017/02/13 Javascript
微信小程序实现多个按钮toggle功能的实例
2017/06/13 Javascript
Bootstrap模态框插入视频的实现代码
2017/06/25 Javascript
JavaScript原型继承_动力节点Java学院整理
2017/06/30 Javascript
浅析vue插槽和作用域插槽的理解
2019/04/22 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
原生js中运算符及流程控制示例详解
2021/01/05 Javascript
[57:55]EG vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
Keras框架中的epoch、bacth、batch size、iteration使用介绍
2020/06/10 Python
python中使用np.delete()的实例方法
2021/02/01 Python
详解CSS3的box-shadow属性制作边框阴影效果的方法
2016/05/10 HTML / CSS
印尼最大的在线购物网站:MatahariMall.com
2016/08/26 全球购物
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
屈臣氏官方旗舰店:亚洲享负盛名的保健及美妆零售商
2019/03/15 全球购物
西班牙三叶草药房:Farmacias Trébol
2019/05/03 全球购物
交通专业个人自荐信格式
2013/09/23 职场文书
北大青鸟学生求职信
2013/09/24 职场文书
环境科学毕业生自荐信
2013/11/21 职场文书
职业技术学校毕业生推荐信
2013/12/03 职场文书
优秀小学生家长评语
2014/01/30 职场文书
员工生日会策划方案
2014/06/14 职场文书
争先创优心得体会
2014/09/12 职场文书
拖欠货款起诉状
2015/05/20 职场文书
2016年学校爱国卫生月活动总结
2016/04/06 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
css position fixed 左右双定位的实现代码
2021/04/29 HTML / CSS
详解Laravel服务容器的优势
2021/05/29 PHP