深入理解Javascript protype

深入理解Javascript protype

 JavaScript并不是一种面向对象的程序设计语言,严格来讲,它并没有什么类的概念,顶多只是JSON对象而已,然而在JavaScript中有prototype这个关键字,利用它,我们可以间接地实现一些面向对象的特性。

?
简单的封装实现
1
2
3
4
5
6
7
8
9
10
varUser =function() {
    this.username ='username';
    this.password ='password';
    this.toString =function() {   
        returnthis.username +':'+this.password;
    }
}
 
varuser =newUser();
document.write(user +'<br />');

  这是一个很简单的封装实现,此时的User可以被视为一个“类”,这里还有一个方法叫做toString,实际上,在需要字符串的地方,对象的toString方法会自动被调用。

  如果在上面这个例子中,toString没有被定义在User里面,也可以通过prototype关键字来定义在外部,效果是等价的。

?
在外部定义成员函数
1
2
3
User.prototype.toString =function() {
    returnthis.username +':'+this.password;
};

  如果在这个例子中没有写prototype关键字,那么user对象实际上是没有toString这个函数可以调用的,因为没有prototype代表这个toString函数仅被定义在User本身之上。

  这是什么原理呢?

  首先,使用new关键字进行新对象user的构造时,是调用了上面赋值给User的匿名函数,这个函数赋予了新对象user一些属性,就像在函数体中所写的那样。如果toString没有被定义在里面,那么此时user只有username和password两个属性。

  如果在外部定义的toString没有加上prototype关键字,那么会发生什么情况呢?User对象具有了toString方法,然而User本身却没有username和password。因此,此时User的username与password均为undefined,有没有觉得比较像面向对象语言中的静态方法呢?是的,相同点在于:我们可以通过“类名”直接调用该方法,该方法不能使用“非静态”成员。

  如果在toString被定义在User.prototype之下,user对象就会具有toString方法,这是为什么呢?因为每个对象都隐含了一个名为__proto__的属性,相当于在User构造函数的最后增加了:

?
在外部定义成员函数
1
this.__proto__ = User.prototype;//注意,这个__proto__是内部名称,不同浏览器实现不同名称也可能不相同。

  prototype这个特殊的属性在构造函数定义时被初始化,初始化时包含了User的构造函数本身和自己的__proto__属性,当用户通过User.prototype的方式定义新属性或方法的时候,这些属性或方法就被增加到User.prototype这个JSON对象之中。由于this.__proto__ = User.prototype;的缘故,调用这个构造函数构造的所有对象的__proto__属性中,都包含有这个新属性或方法。因此,实际上toString并没有成为user下的一个方法,而是user.__proto__下的一个方法。

  然后,实际执行user.toString()时,浏览器将检查user是否具有toString方法可以调用,如果没有,浏览器将继续检查其__proto__属性中是否有toString方法,如果仍然没有,则继续递归向上寻找这个__proto__属性的__proto__属性。如此,就可以解释为什么prototype下定义的方法,都可以被该“类”的所有实例调用的原因了。

转载于:https://my.oschina.net/u/138995/blog/193893

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值