什么是prototype

prototype属性是函数对象的子对象。函数是一个对象,它们对应的类就是function,每个函数对象都具有一个子对象prototype。

prototype包含特定类型的所有实例共享的属性和方法。对普通函数来说这个属性没什么用,只有在构造函数创建实例的时候该属性有用。当通过new来生成一个类的对象时,prototype对象的属性就会成为实例化对象的属性。

总之,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用。

注意:

A.prototype = new B();

理解prototype不应把它和继承混淆。A的prototype为B的一个实例,可以理解A将B中的方法和属性全部克隆了一遍。A能使用B的方法和属性。这里强调的是克隆而不是继承。可以出现这种情况:A的prototype是B的实例,同时B的prototype也是A的实例。

prototype的作用

1.当用new创建一个对象时,prototype对象的属性将自动赋给所创建的对象

<script>//定义一个只有一个属性的类function HelloClass(){this.name="javakc";}//使用函数的prototype属性给类定义新属性HelloClass.prototype.show=function(){alert(this.name);}var obj=new HelloClass(); //创建类HelloClass的一个实例//调用通过prototype原型对象定义的showName方法obj.show();</script>

创建一个类,如果把show这个方法绑定到this上,那么每次创建实例的时候都会新建一个show方法出来,这是没有必要的,所以我们把该类实例共享的这类属性给放在prototype对象中,所有实例是共用一个原型的。这样既保证了每个实例都有show这个方法,又不必每次创建实例的时候都新建这个方法。

2、利用prototype实现伪继承

<script language="javascript">function HelloClass(){//构造方法}function HelloSubClass(){//构造方法}HelloSubClass.prototype=HelloClass.prototype;HelloSubClass.prototype.Propertys="name";HelloSubClass.prototype.subMethods=function(){//方法实现代码alert("in Methods");}var obj=new HelloSubClass();obj.subMethods();</script>

在以上的代码中,首先是HelloSubClass具有了和HelloClass一样的prototype,如果不考虑构造方法,则两个类是等价的。随后,又通过prototype给HelloSubClass赋予了额外的属性和方法。

所以HelloSubClass是在HelloClass的基础上增加了新的属性和方法,从而实现了类的伪继承。(此处注意我们前面所说的不要将继承和克隆混淆的概念)

如果extendClass中本身包含有一个与baseClass的方法同名的方法会怎么样?

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怎么办?

extendClass.prototype = new baseClass();var instance = new extendClass();var baseinstance = new baseClass();//用baseinstance代替instance调用showMsg方法。显示baseClass::showMsg
baseinstance.showMsg.call(instance);

详解prototype相关推荐

  1. 详解prototype、__proto__和constructor

    之前对prototype.__proto__和constructor理解的不够透彻,今天就好好梳理和总结一下. 本文大纲: 1.prototype prototype的英文意思:原型:样本:标准,模范 ...

  2. prototype详解

    Function的prototype 原型链 static详解 此前我有看过网上很多的关于该知识点的详解,很多文章都非常难懂,且篇幅较长,可能是以学习研究为目的.这篇文章结合了理论与实践,希望各位大佬 ...

  3. Vue中 Vue.prototype 详解及使用——作用:避免和已被定义的数据、方法、计算属性产生冲突

    Vue中 Vue.prototype 详解及使用--作用:避免和已被定义的数据.方法.计算属性产生冲突 **应用场景:**在很多组件里用到数据/实用工具,但是不想污染全局作用域.这种情况下,可以通过在 ...

  4. getinstance方法详解_二、设计模式总览及工厂模式详解

    二.架构师内功心法之设计模式 2.架构师内功心法之设计模式 2.1.课程目标 1.通过对本章内容的学习,了解设计模式的由来. 2.介绍设计模式能帮我们解决哪些问题. 3.剖析工厂模式的历史由来及应用场 ...

  5. JavaScript继承详解(四)

    文章截图 - 更好的排版 在本章中,我们将分析Douglas Crockford关于JavaScript继承的一个实现 - Classical Inheritance in JavaScript. C ...

  6. ES5和ES6数组遍历方法详解

    ES5和ES6数组遍历方法详解 在ES5中常用的10种数组遍历方法: 1.原始的for循环语句 2.Array.prototype.forEach数组对象内置方法 3.Array.prototype. ...

  7. (转)面向对象的 JavaScript 编程:dojo.declare 详解

    >>>>>http://www.ibm.com/developerworks/cn/<<<<< JavaScript 早在发明初期时,仅用来 ...

  8. c2064 项不会计算为接受0个参数的函数_【JS必知必会】高阶函数详解与实战

    本文涵盖 前言 高级函数概念 函数作为参数的高阶函数 map filter reduce sort详解与实战 函数作为返回值的高阶函数 isType函数与add求和函数 如何自己创建高阶函数 前言 一 ...

  9. php中 继承中的概念,JavaScript_JavaScript中的继承方式详解,js继承的概念 js里常用的如下 - phpStudy...

    JavaScript中的继承方式详解 js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于 ...

最新文章

  1. 桶排序算法(基于Java实现)
  2. ospf和pat及nat的配置
  3. Docker在Linux上运行NetCore系列(一)配置运行DotNetCore控制台
  4. 启动Tomcat的小细节--MyEclipse
  5. 找二叉树中给定元素的的左孩子结点_LeetCode高频题:二叉树(五)
  6. 国外开源.Net 系统概述
  7. 韩松、朱俊彦等人提出GAN压缩法:算力消耗不到1/9,现已开源
  8. 基于Jupyter Notebook从头学习机器学习 | 入门资料分享
  9. P6800 - 刷入CWM
  10. 国笔手机输入法MTK支持的语言
  11. 安卓平板python编程软件下载_notepad++下载-notepad++中文版下载v7.6.2 中文增强版-西西软件下载...
  12. 微信小程序(十二)uni-app框架开发及组件库
  13. php 聚合广告平台,带统计功能的广告管理系统PHP源码 多维度投放策略 多种风格后台...
  14. qt中如何模拟按钮点击_qt模拟鼠标单击事件
  15. KEA128时钟系统
  16. Stay hungry. Stay foolish.
  17. latex怎样让题号顶格_笔记本-latex写作问题集锦
  18. 高中英语教师资格证考试经验贴
  19. js跨域交互(jQuery+php)之jsonp使用心得
  20. oracle 临时表空间使用率

热门文章

  1. android滑动卡片开源,CardSlideView 一行代码实现ViewPager卡片效果
  2. 隐秘的角落:张东升的人生,给所有职场人提了个醒
  3. 打一局王者荣耀比写一篇博客要容易的多!
  4. 结对-四则运算答题器-设计文档
  5. 不小心永久删除的文件怎么恢复
  6. 十六进制的转换为十进制两种常见方法
  7. 【Autosar 存储栈Memery Stack 1.NVM Block的了解】
  8. GoAhead_UserGuide_2
  9. 第四章 一个失去部队的将军 还不如一个回作战的小兵
  10. 2014总结2015展望