`

诡异的prototype

阅读更多

javascript中的prototype使用起来感觉变化莫测,不是很好理解。现总结一下,以便日后查阅。

1.prototype只能通过类名(或者叫function名)来访问

2.父类中的变量只能通过子类名.prototype.变量名 的方式来修改,通过子类的对象只能读父类中的变量,如果修改的话,其实修改的是子类自己的同名变量

3.通过子类的对象读取一个变量时,先在子类中找,如果子类中没有,再到父类中找

4.每个子类对象都持有同一个父类的引用

比如:

function ClassA()
{
    this.a='a';

    this.f=function(){alert();};
}
function ClassB()
{
    this.b='b';

    this.sf=function(){alert();};
}

ClassB.prototype=new ClassA();   //ClassB继承自ClassA

 

var objB1=new ClassB();

var objB2=new ClassB();

 

alert(objB1.f == objB2.f);  //参照同一个父类的方法

alert(objB1.sf == objB2.sf); //参照各自的子类方法

 

alert(objB1.a); //因为ClassB中没有a,所以访问父类的变量a

 

objB1.a='x'; //ClassB中增加变量a,值为x,和父类中的变量a没有关系

 

ClassB.prototype.a='y';   //将ClassA中的a的值修改为y

 

alert(objB1.a); //因为ClassB中有a,所以访问子类的变量a

 

输出:

true

false

a

x

5.可以通过子类名.prototype.变量名 的方式来修改父类中的变量,或者向父类中增加变量

也可以通过子类的对象名.变量名 的方式来修改子类中的变量,或者向子类中增加变量。

比如:

function ClassA()
{

    this.a='a';
}
function ClassB()
{

    this.b='b';
}

ClassB.prototype=new ClassA();

 

var objB1=new ClassB();

 

objB1.c='c';  //objB1中增加变量c

ClassB.prototype.d='d'; //父类的对象中增加变量d

 

alert(objB1.c);

alert(objB1.d);

 

输出:

c

d

6.给prototype赋值的注意事项

方法1:

function ClassA()
{

    this.a='a';
}
function ClassB()
{

    this.b='b';
}

 

//ClassB.prototype相当于ClassA的一个对象
ClassB.prototype=new ClassA();

 

var objB1=new ClassB();

 

//修改ClassA中的变量a

ClassB.prototype.a='a1';

//向ClassA中增加变量c

ClassB.prototype.c='c';

alert(objB1.a);

alert(objB1.c);

 

输出:

a1

c

 

方法2:

function ClassA()
{

    this.a='a';
}
function ClassB()
{

    this.b='b';
}

 

ClassB.prototype.x='x';

ClassB.prototype.y='y';

 

var objB1=new ClassB();

//创建对象时已经创建了变量x和y

alert(objB1.x);
alert(objB1.y);

 

//此时objB1已经创建完,所以ClassA不是ClassB的父类

ClassB.prototype=new ClassA();

//追加父类时原来的变量x和y不会丢失

alert(objB1.x);
alert(objB1.y);

 

//ClassA不是ClassB的父类

alert(objB1.a);

输出:

x

y

x

y

undefined

 

方法3:

function ClassA()
{

    this.a='a';
}
function ClassB()
{

    this.b='b';
}

 

ClassB.prototype.x='x';

ClassB.prototype.y='y';

ClassB.prototype=new ClassA();

 

var objB1=new ClassB();

//new ClassA()时x和y被覆盖

alert(objB1.x);

alert(objB1.y);

 

输出:

undefined

undefined

 

 

分享到:
评论
1 楼 sygjzmh 2014-01-03  

相关推荐

    javascript 有趣而诡异的数组

    ### JavaScript有趣而诡异的数组 #### 一、引言 在JavaScript编程中,数组是一种非常基础且常用的数据结构。然而,在实际开发过程中,有时我们会遇到一些看似“诡异”的行为,这些行为背后其实有着深刻的原理和...

    js replace正则相关的诡异问题

    在JavaScript中,`String.prototype.replace()`方法用于在字符串中替换匹配到的子串。这个方法的一个有趣特性是它支持正则表达式,同时也允许使用特殊的替换字符串语法。在上述问题中,开发者遇到了与`replace()`...

    javascript parseInt 大改造

    例如,你可以修改Function.prototype.toString方法,改变其行为。当然,这种做法应当谨慎使用,因为它可能会影响到函数的默认行为,并可能导致代码难以理解和维护。 为了安全地重定义方法,作者建议先保存原始方法...

    JS-backyard:在JS后院,您可能不知道一些有趣的事情

    首先,JavaScript是基于原型(Prototype)的语言,这意味着所有对象都有一个内部链接到另一个对象——它的原型。这种机制使得继承变得非常直观,但同时也可能导致一些不预期的行为,比如属性查找的链式过程。理解这...

    js-ghost-stories:JavaScript鬼故事

    JavaScript鬼故事,这是一个独特的话题,通常用来描述开发者在编程过程中遇到的诡异问题或者难以理解的JavaScript行为。JavaScript,作为Web开发中的重要脚本语言,因其动态类型、原型链以及异步编程模式等特性,...

Global site tag (gtag.js) - Google Analytics