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)


相关推荐

  • Selenium2+python自动化48-登录方法(参数化)

    Selenium2+python自动化48-登录方法(参数化)

  • 如何锁定工作站[通俗易懂]

    如何锁定工作站[通俗易懂]如何锁定工作站        使用LockWorkStation函数即可锁定工作站。系统会显示一个锁定对话框,告诉用户此工作站正在使用并且已经被锁定,可以被执行锁定的用户或管理员解锁,解锁的方式是按下CTRL_ALT_DEL并用正确的帐号和密码登陆。      LockWorkStation函数成功调用的条件是:      调用者必须是运行在系统交互桌面上的一般进程。   

  • Intro to Filtering with Network Monitor 3.0

    Intro to Filtering with Network Monitor 3.0

  • C语言中的移位运算

    C语言中的移位运算移位运算移位运算包括左移和右移左移运算:x&amp;lt;&amp;lt;k:x左移k位,并在右端补零。右移运算:逻辑右移:x&amp;gt;&amp;gt;k:x右移k位,并在左端补零。算术右移:x&amp;gt;&amp;gt;k:x右移k位,并在左端补最高有效位的值。下表为对一个8位参数x的两个不同的值做不同的一位操作得到的结果:操作值参数x[01100011][10010101]x&amp;l

  • 10分钟拿下 HashMap「建议收藏」

    10分钟拿下 HashMap「建议收藏」请相信我,你一定会更优秀!文章目录:1、什么是HashMap?什么时候选择HashMap?2、HashMap数据结构及其工作原理?2.1数据结构2.2工作原理3、HashMap和HashTable的异同?4、如何优化HashMap?1、什么是HashMap?什么时候选择HashMap?说到容器,你肯定会想到Java中对象存储容器还有Arr…

  • fedora14安装教程_Linux下zip安装使用方法

    fedora14安装教程_Linux下zip安装使用方法LinuxFedora12下,安装SAMBA ,使用以下命令:yuminstallsambayuminstallsamba

发表回复

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

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