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 相关文章推荐
不错的JS中变量相关的细节分析
Aug 13 Javascript
提取字符串中年月日的函数代码
Nov 05 Javascript
JQuery选择器绑定事件及修改内容的方法
Jan 23 Javascript
javascript面向对象程序设计(一)
Jan 29 Javascript
javascript中tostring()和valueof()的用法及两者的区别
Nov 16 Javascript
超实用的javascript时间处理总结
Aug 16 Javascript
vue使用axios跨域请求数据问题详解
Oct 18 Javascript
Vue-Access-Control 前端用户权限控制解决方案
Dec 01 Javascript
layui点击数据表格添加或删除一行的例子
Sep 12 Javascript
vue在App.vue文件中监听路由变化刷新页面操作
Aug 14 Javascript
JS removeAttribute()方法实现删除元素的某个属性
Jan 11 Javascript
深入浅析React中diff算法
May 19 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的栏目导航程序
2006/10/09 PHP
PHP5常用函数列表(分享)
2013/06/07 PHP
ThinkPHP3.1新特性之G方法的使用
2014/06/19 PHP
Yii遍历行下每列数据的方法
2016/10/17 PHP
如何用javascript控制上传文件的大小
2006/10/26 Javascript
利用javascript查看html源文件
2006/11/08 Javascript
arguments对象
2006/11/20 Javascript
javascript入门·图片对象(无刷新变换图片)\滚动图像
2007/10/01 Javascript
javascript AutoScroller 函数类
2009/05/29 Javascript
两个select之间option的互相添加操作(jquery实现)
2009/11/12 Javascript
jQuery中$.fn的用法示例介绍
2013/11/05 Javascript
javascript引用赋值(地址传值)用法实例
2015/01/13 Javascript
深入浅析JavaScript中的3DES
2016/08/24 Javascript
AngularJS 限定$scope的范围实例详解
2017/06/23 Javascript
Node.js assert断言原理与用法分析
2019/01/04 Javascript
JavaScript对象属性操作实例解析
2020/02/04 Javascript
WEB前端性能优化的7大手段详解
2020/02/04 Javascript
JS+HTML5本地存储Localstorage实现注册登录及验证功能示例
2020/02/10 Javascript
vue绑定数字类型 value为数字的实例
2020/08/31 Javascript
python遍历序列enumerate函数浅析
2017/10/17 Python
python 读文件,然后转化为矩阵的实例
2018/04/23 Python
如何在Python中实现goto语句的方法
2019/05/18 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
2019/06/18 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
2019/08/24 Python
python实现Oracle查询分组的方法示例
2020/04/30 Python
Python通用唯一标识符uuid模块使用案例
2020/09/10 Python
在python3.9下如何安装scrapy的方法
2021/02/03 Python
CSS3实现文本垂直排列的方法
2018/07/10 HTML / CSS
html5 制作地图当前定位箭头的方法示例
2020/01/10 HTML / CSS
主键(Primary Key)约束和唯一性(UNIQUE)约束的区别
2013/05/29 面试题
商场经理竞聘演讲稿
2014/01/01 职场文书
营销总经理岗位职责范本
2014/09/02 职场文书
销售简历自我评价怎么写
2014/09/26 职场文书
幼儿园学前班幼儿评语
2014/12/29 职场文书
2015年学校减负工作总结
2015/05/19 职场文书
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
2022/04/13 Java/Android