作者:轩脉刃

1 原型法设计模式

在.Net中可以使用clone()来实现原型法

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

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

a 类方法

b 对象方法

c 原型方法

例子:

  1. functionPeople(name)
  2. {
  3. this.name=name;
  4. //对象方法
  5. this.Introduce=function(){
  6. alert("My name is "+this.name);
  7. }
  8. }
  9. //类方法
  10. People.Run=function(){
  11. alert("I can run");
  12. }
  13. //原型方法
  14. People.prototype.IntroduceChinese=function(){
  15. alert("我的名字是"+this.name);
  16. }
  17. //测试
  18. var p1=newPeople("Windking");
  19. p1.Introduce();
  20. People.Run();
  21. 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的实例。

先看一个实验的例子:

  1. function baseClass()
  2. {
  3. this.showMsg =function()
  4. {
  5. alert("baseClass::showMsg");
  6. }
  7. }
  8. function extendClass()
  9. {
  10. } extendClass.prototype =new baseClass();
  11. var instance =new extendClass();
  12. instance.showMsg();// 显示baseClass::showMsg

运行一下 »

我们首先定义了baseClass类,然后我们要定义extentClass,但是我们打算以baseClass的一个实例为原型,来克隆的extendClass也同时包含showMsg这个对象方法。

extendClass.prototype = new baseClass()就可以阅读为:extendClass是以baseClass的一个实例为原型克隆创建的。

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

下面是扩展实验2:

  1. function baseClass()
  2. {
  3. this.showMsg =function()
  4. {
  5. alert("baseClass::showMsg");
  6. }
  7. }
  8. function extendClass()
  9. {
  10. this.showMsg =function()
  11. {
  12. alert("extendClass::showMsg");
  13. }
  14. }
  15. extendClass.prototype =new baseClass();
  16. var instance =new extendClass();
  17. instance.showMsg();//显示extendClass::showMsg

运行一下 »

实验证明:函数运行时会先去本体的函数中去找,如果找到则运行,找不到则去prototype中寻找函数。或者可以理解为prototype不会克隆同名函数。

那么又会有一个新的问题:

如果我想使用extendClass的一个实例instance调用baseClass的对象方法showMsg怎么办?

答案是可以使用call:

  1. extendClass.prototype =new baseClass();
  2. var instance =new extendClass();
  3. var baseinstance =new baseClass();
  4. baseinstance.showMsg.call(instance);//显示baseClass::showMsg

运行一下 »

这里的baseinstance.showMsg.call(instance);阅读为“将instance当做baseinstance来调用,调用它的对象方法showMsg”

好了,这里可能有人会问,为什么不用baseClass.showMsg.call(instance);

这就是对象方法和类方法的区别,我们想调用的是baseClass的对象方法

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

  1. <script type="text/javascript">
  2. function baseClass()
  3. {
  4. this.showMsg =function()
  5. {
  6. alert("baseClass::showMsg");
  7. }
  8. this.baseShowMsg =function()
  9. {
  10. alert("baseClass::baseShowMsg");
  11. }
  12. }
  13. baseClass.showMsg =function()
  14. {
  15. alert("baseClass::showMsg static");
  16. }
  17. function extendClass()
  18. {
  19. this.showMsg =function()
  20. {
  21. alert("extendClass::showMsg");
  22. }
  23. }
  24. extendClass.showMsg =function()
  25. {
  26. alert("extendClass::showMsg static")
  27. }
  28. extendClass.prototype =new baseClass();
  29. var instance =new extendClass();
  30. instance.showMsg();//显示extendClass::showMsg
  31. instance.baseShowMsg();//显示baseClass::baseShowMsg
  32. instance.showMsg();//显示extendClass::showMsg
  33. baseClass.showMsg.call(instance);//显示baseClass::showMsg static
  34. var baseinstance =new baseClass();
  35. baseinstance.showMsg.call(instance);//显示baseClass::showMsg
  36. </script>

运行一下 »

JS中的phototype详解的更多相关文章

  1. JS中this关键字详解

    本文主要解释在JS里面this关键字的指向问题(在浏览器环境下). 阅读此文章,还需要心平气和的阅读完,相信一定会有所收获,我也会不定期的发布,分享一些文章,共同学习 首先,必须搞清楚在JS里面,函数 ...

  2. JS 中 this 关键字详解

    本文主要解释在JS里面this关键字的指向问题(在浏览器环境下). 首先,必须搞清楚在JS里面,函数的几种调用方式: 普通函数调用 作为方法来调用 作为构造函数来调用 使用apply/call方法来调 ...

  3. Bom和Dom编程以及js中prototype的详解

    一.Bom编程: 1.事件练习: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...

  4. JavaScript面向对象(一)——JS OOP基础与JS 中This指向详解

      前  言 JRedu 学过程序语言的都知道,我们的程序语言进化是从"面向机器".到"面向过程".再到"面向对象"一步步的发展而来.类似于 ...

  5. JS中navigator对象详解

    <code class="language-html"><!doctype html> <html> <head> <meta ...

  6. js中Date()对象详解

    var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-???? ...

  7. js中的逻辑运算符详解(||、&&、!)

    视频地址:https://www.bilibili.com/video/BV1Y7411K7zz?p=1 一直以来都没弄清楚js中的逻辑运算符是怎么回事 , 一直都以为他们的用法和java一样 , 今 ...

  8. js中window对象详解以及页面跳转

    1.window.top.window.location = "index.asp"; 2.window.top.location.href="index.asp&quo ...

  9. node.js中express-session配置项详解

    官方地址:https://www.npmjs.com/package/express-session 作用:用指定的参数创建一个session中间件,sesison数据不是保存在cookie中,仅仅s ...

随机推荐

  1. POI - Excel API

    一.概述    1. Apache POI是Apache软件基金会的开放源码函式库,POI提供API给java程式对Microsoft Office格式档案读和写的功能.    2. 结构       ...

  2. Selenium IDE的一些操作

    1.运行速度过快时,可能出现找不到元素的情况,影响运行结果,将速度调慢慢一些,就可以运行成功. 如果为其他情况找不到元素,则需要另外找原因,有可能元素定位有问题,有可能无该元素. 2.导出录制的脚本为 ...

  3. IP地址与子网掩码的计算

    128.0.0.0=1 192.0.0.0=2224.0.0.0=3 240.0.0.0=4 248.0.0.0=5 252.0.0.0=6 254.0.0.0=7 255.0.0.0=8255.12 ...

  4. cocos进阶教程(3)Lua加密技术

    如果开发者不想让游戏中的资源或脚本文件轻易的暴露给其他人,一般会采用对文件进行加密的方式来保护文件或资源被盗用.Quick-Cocos2d-x 为开发者提供了xxtea加密算法,用来对脚本文件及资源进 ...

  5. Python通用网络爬虫脚本

    from sys import argv from os import makedirs,unlink,sep,mkdir from os.path import dirname,exists,isd ...

  6. Digital Image Processing 学习笔记1

    第一章 1.1 数字图像 一幅图像可以定义为一个而为函数, 其中x和y是空间坐标,而在任何一对空间坐标(x, y)处的幅值f称为图像在该点处的强度或灰度.当x, y和灰度值f是有限的离散数值时,该图像 ...

  7. 2017-2018-2 20165207 实验三《敏捷开发与XP实践》实验报告

    java 实验三 实验报告 实验内容 代码规范 不规范的代码可能妨碍阅读,在粘贴下来老师在云班课中设置的提交点一的代码之后,我首先使用了IDEA中Code选项卡的Reformat Code功能规范代码 ...

  8. qq空间相册下载

    qq空间相册下载 描述 目前功能只可以下载 单个相册 程序基本是3个独立分开的部分. 解析(某一用户)所有相册 解析(单个)相册所有图片地址并写文件 根据文件下载图片 目的 只要有权限可以访问到的相册 ...

  9. 在apache中使用.htaccess文件的注意事项

    在apache的配置文件中: <VirtualHost *:80> ServerName tp5.com DocumentRoot d:/wamp/www/tp5.com/public & ...

  10. Stitching模块中focalsFromHomography初步研究

    在Stitching模块中,通过“光束法平差”的时候,有一个步骤为“通过单应矩阵估算摄像头焦距”,调用的地方为:   , ));    ] ];    d2 ] ]) ] ]);    v1 ] ]  ...