JS中的prototype[通俗易懂]

JS中的prototype[通俗易懂]JS中的phototype是JS中比较难理解的一个部分本文基于下面几个知识点:1原型法设计模式在.Net中可以使用clone()来实现原型法原型法的主要思想是,现在有1个类A,我想要创建一个类B,这

大家好,又见面了,我是你们的朋友全栈君。

JS中的phototype是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方法

 

 

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

 

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

 

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

 

<
script type
=

text/javascript

>


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




<
/
script>

 

作者:轩脉刃(yjf512)
出处:(http://www.cnblogs.com/yjf512/
版权声明:本文的版权归作者与博客园共有。欢迎转载阅读,转载时须注明本文的详细链接。 

 

[参考文章]

http://tech.ddvip.com/2009-05/1243588303121461.html

http://jetway.iteye.com/blog/56533

http://xiaofeizm55333.iteye.com/blog/80913

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/155009.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • IDEA忽略文件,防止git提交不想提交的文件的探索

    IDEA忽略文件,防止git提交不想提交的文件的探索使用IDEA开发有一段时间了,从陌生到熟悉的过程算是很平稳的度过,感谢IntelliJIDEA交流群(群号244908708)里面的群友对我提供的帮助,感谢群主的github上面提供的资料。这篇文章是探索git忽略文件提交的一些方面的研究,分为2个部分,内容如下1.在项目中隐藏掉你不想看到的文件夹或者文件,2.使用.ignore插件在IDEA中忽略你要提交的文件。一个…

  • 大数据时代下的个人知识管理

    大数据时代下的个人知识管理前言说到个人知识管理,在之前通过网络查询了一些资料,定义看起来让人蠢蠢欲动,作用是能快速找到自己收藏的文档。每个人或多或少都必须的有一些文件管理的习惯,管理就是一种习惯,利用专业的软件可以更容易的养成个人知识管理的习惯。当不小心清空了自己收藏了6年的浏览器收藏夹,“幻想”有一款软件,让我们在查找自己之前保存的资料的时候可以不用太费力气,不至于打断自己的思路,不影响自己的工程进度。关于大数据

  • 卷积神经网络(CNN)基础介绍

    卷积神经网络(CNN)基础介绍

  • macbook用什么记笔记_macbook怎么查看文件

    macbook用什么记笔记_macbook怎么查看文件朋友发过来一个,ziw文件,我Mac端下载了为知笔记Mac客户端,还是打不开,导入文件后只有文件标题没有文件内容解决方法:把.ziw文件后缀改成,.zip文件解压,zip文件打开HTML文件就可以正常浏览了…

    2022年10月12日
  • Android在Context详细解释 —- 你不知道Context

    Android在Context详细解释 —- 你不知道Context

    2021年12月17日
  • hive 异常值_could not instantiate bean class

    hive 异常值_could not instantiate bean classhive升级过程中异常记录-java.lang.ClassCastException:org.apache.hadoop.hive.ql.io.orc.OrcStructcannotbecasttoorg.apache.hadoop.io.BinaryComparable常规ClassCastException问题梳理-来源网络Causedby:java.lang.ClassCastException:org.apache.hadoop.io.Textcannotbecastt

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号