JavaScript中的prototype

关于prototype:

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

现在有一个类A,我想要创建一个类B,我希望这个B类能够继承A类的方法和属性,并且能进行扩展(即添加额外的方法和属性)。那么我们称B的原型为A。即为:B.prototype = A

javascript的方法可以分为三类:

//1.类方法

function object(name)
{
      this.name = "object類";
      //对象方法: object對象有一個Introduce方法
      this.Introduce=function(){
          alert("My name is "+this.name);
      }
}

//2.对象方法       
//类方法:People类具有的Run方法
object.Run=function(){
       alert("I can run");
}

//3.原型方法    
//原型方法People的prototype(原型)有一个IntroduceChinese方法
object.prototype.IntroduceChinese=function(){
        alert("我的名字是"+this.name);
}
       
//测试

var p1=new object("Windking");
p1.Introduce();               //    p1的对象方法,每个对象都能调用
object.Run();                  //    object的类方法
p1.IntroduceChinese();     //    p1的原型(父级函数)中,有这个方法

关于call()与appl():

obj1.func.call(obj)等同于:意思是将obj看成obj1,调用func方法

var func = new function(){
     console.log("调用了func函数")
     this.a = "func";  //每个func函数都有一个属性a,等于func
}
   
var myfunc=function(x){
      //var a="myfunc";
      alert(this.a);
             alert(x);

}

// 对象func调用myfunc方法,并传入参数["xxx","yyy","zzz","www"]
// apply中的实参其实都被放入了一个数组中

myfunc.call (func,["xxx","yyy","zzz","www"]);     
// xxx,yyy,zzz,www    call只传入一个参数,不打数组符号,结果就为xxx
myfunc.apply(func,["xxx","yyy","zzz","www"]);    
// xxx    apply后面必须跟数组,

一个栗子:

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的方法同名的方法会怎么样?

第二个栗子:

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

时间: 2024-08-09 17:13:49

JavaScript中的prototype的相关文章

JavaScript中Object.prototype.toString方法的原理

在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. ? 1 2 var arr = []; console.log(Object.prototype.toString.call(arr)) //"[object Array]" 本文要讲的就是,toString方法是如何做到这一点的,原理是什么. ECMAScript 3 在ES3中,Object.prototype.toString方法的规范如下:

理解javascript中的prototype

以前一直对javascript中的prototype不是很理解,今天在阅读了<javascript高级程序设计之后>终于理解了其中的prototype.来简单的总结一下从书中学习到的内容. 我们都知道在创建了一个function之后,这个function就具有了prototype这样的一个属性,利用这个prototype我们可以做很多的事情,其中我们经常用到的一点就是利用它来当做构造函数,因此,本文重要从function作为构造函数的角度来说明一下prototype. 其实javascript

JavaScript中的prototype和__proto__细致解析

最近在学js,体会了一点点它的灵活性.对于初学者的我,总是被它的灵活感到晕头转向,最近发现了一点东西想与大家分享. JavaScript中的prototype和_proto_: 我们先了解一点js中的基础知识,首先我们先看一段js代码: 1 var object = new Object; 2 console.log("object:", object); 3 object.member1 = "abcd"; 4 5 var obj = {}; 6 obj.memb

Javascript中的prototype与继承

通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性列表.javascript创建对象时采用了写时复制的理念. 只有构造器才具有prototype属性,原型链继承就是创建一个新的指针,指向构造器的prototype属性. prototype属性之所以特别,是因为javascript时读取属性时的遍历机制决定的.本质上它就是一个普通的指针. 构造器包括: 1.Object 2.Function 3.Array 4.Date 5.String 下面我们来举一些例

Javascript中的Prototype到底是啥

Javascript也是面向对象的语言,但它是一种基于原型Prototype的语言,而不是基于类的语言.在Javascript中,类和对象看起来没有太多的区别. 通常,这样创建一个对象: function person(name){ this.sayHi = function(){ alert('hi ' + this.name); } this.name = name; } var p = new person("dan"); p.sayHi(); 以上,使用new关键字,通过对象(

Javascript中的Prototype到底是什么

Javascript也是面向对象的语言,但它是一种基于原型Prototype的语言,而不是基于类的语言.在Javascript中,类和对象看起来没有太多的区别. 什么是prototype: function定义的对象有一个prototype属性,prototype属性又指向了一个prototype对象,注意prototype属性与prototype对象是两个不同的东西,要注意区别.在prototype对象中又有一个constructor属性,这个constructor属性同样指向一个constr

深入理解Javascript中this, prototype, constructor

在Javascript面向对象编程中经常需要使用到this,prototype和constructor这3个关键字. 1.首先介绍一下this的使用:this表示当前对象;如果在全局中使用this,则this为当前页面对象window;如果在函数中使用this,则this为调用该函数的对象;可以使用apply和call两个全局函数来改变this的指向. 接下来,首先通过几个demo程序验证一下: function testFunction(){ console.log(this.variable

JavaScript——中的prototype(原型)

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=functi

javascript中的prototype和constructor

http://www.jb51.net/article/25027.htm http://blog.csdn.net/chunqiuwei/article/details/22092551 http://developer.51cto.com/art/200907/134913.htm 总结: 特别说明:只有构造函数才有prototype属性,而构造函数的实例是没有该属性的,也就是说 console.log(a1.prototype)输出的是undefined.在javascript中,每个函数

我所理解的JavaScript中的prototype与__proto__、constructor

前几天当我同时向往说起node.js的时候,我逐渐发现原来JS是个多么丰富语言——我原来一直都在井底(初学者的悲哀).当我想认认真真学习JavaScript的时候,我发现prototype与__proto__.constructor这几个家伙老是让我很有挫败感(学一门语言属性都搞不懂,还学个P).但我是一个不轻易服输的人,也不是不会妥协,就是有这种习惯,我就要去做就要去弄懂哪怕挫折感更多.于是,我在网上搜大神们的对这几个让我烦恼的东西的阐述与解释.最后的结果是--还是搞不懂.“什么对象原型,什么