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 技巧和窍门整理(8个)
Apr 22 Javascript
谈谈JavaScript中的函数与闭包
Apr 14 Javascript
jquery中通过父级查找进行定位示例
Jun 28 Javascript
jQuery中ajax的使用与缓存问题的解决方法
Dec 19 Javascript
coffeescript使用的方式汇总
Aug 05 Javascript
Bootstrap基本布局实现方法详解
Nov 25 Javascript
AngularJS获取json数据的方法详解
May 27 Javascript
Bootstrap 模态框(Modal)带参数传值实例
Aug 20 Javascript
checkbox:click事件触发span元素内容改变的方法
Sep 11 Javascript
Vue父组件监听子组件生命周期
Sep 03 Javascript
JavaScript逻辑运算符相关总结
Sep 04 Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
Nov 16 Javascript
简单实现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
PHP 抓取网页图片并且另存为的实现代码
2010/03/24 PHP
php可应用于面包屑导航的迭代寻找家谱树实现方法
2015/02/02 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
2017/12/31 PHP
laravel 解决后端无法获取到前端Post过来的值问题
2019/10/22 PHP
权威JavaScript 中的内存泄露模式
2007/08/13 Javascript
JavaScript中出现乱码的处理心得
2009/12/24 Javascript
jquery中交替点击事件的实现代码
2014/02/14 Javascript
javascript如何写热点图
2015/12/08 Javascript
jQuery插件imgPreviewQs实现上传图片预览
2016/01/15 Javascript
jQuery绑定事件监听bind和移除事件监听unbind用法实例详解
2016/01/19 Javascript
简单谈谈ES6的六个小特性
2016/11/18 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
angular 基于ng-messages的表单验证实例
2017/05/04 Javascript
微信小程序组件之srcoll-view的详解
2017/10/19 Javascript
Vue条件循环判断+计算属性+绑定样式v-bind的实例
2018/09/18 Javascript
Vue+element-ui添加自定义右键菜单的方法示例
2020/12/08 Vue.js
原生JavaScript实现进度条
2021/02/19 Javascript
删除目录下相同文件的python代码(逐级优化)
2012/05/25 Python
30分钟搭建Python的Flask框架并在上面编写第一个应用
2015/03/30 Python
python回调函数中使用多线程的方法
2017/12/25 Python
python实现单向链表详解
2018/02/08 Python
python快速编写单行注释多行注释的方法
2019/07/31 Python
Django实现发送邮件找回密码功能
2019/08/12 Python
Python对列表的操作知识点详解
2019/08/20 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
2019/09/16 Python
python 视频逐帧保存为图片的完整实例
2019/12/10 Python
Pytorch中的自动求梯度机制和Variable类实例
2020/02/29 Python
keras-siamese用自己的数据集实现详解
2020/06/10 Python
StubHub中国:购买和出售全球活动门票
2020/01/01 全球购物
大学生求职计划书
2014/04/30 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
个人总结与自我评价2015
2015/03/11 职场文书
同学会演讲稿
2019/04/02 职场文书
2019年大学生暑期社会实践调查报告模板
2019/11/07 职场文书
解决Laravel使用验证时跳转到首页的问题
2021/11/17 PHP