详解prototype

什么是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);

 

 

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: prototype是JavaScript中的一个关键属性,每一个函数对象都有一个prototype属性。在JavaScript中,对象是通过构造函数创建的,而prototype属性就是用来指向该构造函数的原型对象。 原型对象是一个普通的对象,它包含了可以被实例对象共享的属性和方法。当我们创建一个实例对象时,实例对象会通过__proto__属性链接到构造函数的原型对象上,从而实现了属性和方法的继承。 通过原型对象,我们可以为实例对象添加公共的属性和方法。当实例对象需要调用某个属性或方法时,如果实例对象自身不存在这个属性或方法,它会自动在原型对象中查找。这样就实现了属性和方法的共享和复用,提高了代码的效率。 可以通过调用构造函数的prototype属性来访问原型对象,我们可以在原型对象上添加属性和方法。例如,可以通过给Array.prototype添加方法来扩展数组对象的功能,也可以给Object.prototype添加方法来扩展所有对象的功能。 需要注意的是,原型对象是共享的,当我们修改原型对象上的属性或方法时,所有的实例对象都会受到影响。因此,在修改原型对象时需要谨慎,避免对已有的对象造成不必要的影响。 总结来说,prototype属性是JavaScript中用于实现继承和共享属性的关键属性,它定义了构造函数的原型对象,使得所有通过该构造函数创建的实例对象都能够共享原型对象上的属性和方法。通过原型对象,我们可以为实例对象添加公共的属性和方法,提高代码的复用性和效率。 ### 回答2: prototype属性是JavaScript中每个对象都拥有的一个属性,它是一个指针,指向该对象的原型。原型是一个普通的对象,它包含了一些可被该对象实例共享的属性和方法。 通过使用prototype属性,我们可以为对象定义共享的属性和方法。当我们创建一个对象的实例时,该对象实例将会从其原型中继承这些共享的属性和方法。 在JavaScript中,对象的原型是通过构造函数来创建的。在创建构造函数时,会自动为该构造函数创建一个prototype属性,并将其指向一个空对象。我们可以通过向原型对象中添加属性和方法,从而为实例对象提供共享的属性和方法。 原型对象中的属性和方法,可以被该构造函数创建的所有实例对象公用。当我们访问实例对象中的属性或方法时,如果实例对象本身没有该属性或方法,就会通过原型链的查找,去原型对象中寻找。 原型属性的优势在于节省内存。因为所有实例对象共享同一个原型对象,而不是每个实例对象都拥有一份相同的属性和方法。这样就可以大大减少内存占用。 另外,通过在原型对象中定义属性和方法,还可以实现动态的属性和方法。即使在对象创建之后,我们仍然可以通过修改原型对象来为其新增属性和方法,而所有实例对象都会即刻生效。 总之,prototype属性是JavaScript中用于实现对象间继承和共享属性的重要机制,它可以让我们更高效地创建对象,并且提供了灵活的方式来定义和修改对象的共享属性和方法。 ### 回答3: prototype属性是JavaScript中的一个特殊属性,它是由每个函数创建的对象所共享的。每个构造函数都有一个prototype属性,它指向一个对象。 使用prototype属性可以给对象添加方法和属性,这些方法和属性可以被该构造函数创建的所有对象访问和共享。当我们创建一个新对象时,JavaScript会自动为该对象创建一个__proto__属性,它指向构造函数的prototype属性。 通过给prototype属性添加方法,我们可以在构造函数创建的每个对象中共享这些方法。这么做的好处是避免了在每个对象中重复创建方法的内存消耗,同时也提高了代码的可维护性。 原型继承是JavaScript的一种核心概念,它基于对象的原型链,在对象的原型链中查找属性和方法。当我们访问一个对象的属性或方法时,JavaScript会先在对象本身查找,如果找不到,就会去原型链上的原型对象中查找。这种属性和方法的继承关系使得JavaScript的对象可以“继承”来自原型对象的属性和方法。 通过使用构造函数和对象的原型链,JavaScript实现了类似于面向对象编程语言的继承概念。我们可以创建一个构造函数,通过它创建的对象会自动继承该构造函数的原型属性和方法。这样可以实现代码的复用和灵活性,减少重复的代码。 总结来说,prototype属性是通过构造函数创建的对象所共享的一个属性。通过给prototype属性添加方法和属性,可以实现这些方法和属性在所有对象中的共享。原型继承是JavaScript中实现代码复用和灵活性的一种机制,通过原型链的查找,对象可以继承来自原型对象的属性和方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值