javascript中的原型链

java中除了3个基本类型以外全部都是对象

对象中比较常见的是函数对象,通常用以下形式来定义

var foo = function(){

…...

}

function foo(){

…...

}

甚至

Function foo = new Function("", 

"……"

);

三者等价


new 运算

函数对象可以使用new运算符,作用是通过一个对象生成另一个对象,源对象我们称为模板对象,新对象我们称为实例对象

new运算符只能作用于函数对象,作用于其他对象时会抛出错误

var bar = new foo() 或 var bar = new foo

二者等价,这里foo是模板对象,bar是实例对象

new运算做了哪些事呢?它等价于以下操作:(1)给bar分配内存空间,(2)把bar的原型指向foo.prototype,(3)执行foo函数内的代码


注意:上面的顺序是(2)(3)而不是(3)(2),这样的话在foo函数内替换foo的prototype就只能在下一次new的时候才会见效了,因为每次bar的原型都是修改前foo.prototype。(这里“替换”指的是更改prototype这个指针而非修改foo.prototype这个对象的属性)

具体参看http://hi.baidu.com/baiduba/item/a2a555e6f01ca9a0c10d75fc 


注意:new的时候并没有把模板对象的所有属性复制到实例对象,没有对实例对象的prototype属性赋值,没有修改实例对象的constructor属性


原型链

既然没有复制所有属性,那么为什么我们又能访问实例对象的属性呢?这就是原型对象的作用了

每一个javascript对象都有一个原型,对象里包含了一个私有属性,指向对象原型的指针,当然,这个“原型”也是一个对象

每次查找该对象的属性时,如果每没有找到就会自动找原型里的同名属性,还没找到就找原型的原型,以此类推

这就叫做javascript的“原型链”

在ECMA标准里无法直接访问某个对象的原型,好在firefox,chrome等常见浏览器都提供了非标准的访问方法,使用.__proto__属性来访问对象的原型(鉴于它的流行,__proto__将来会出现在EcmaScript6标准中)(其实EcmaScript5标准里已经有了同样功能的getPrototypeOf方法)

注意:当实例对象创建后更改模板对象的prototype属性不会更改实例对象的原型


Object.create()方法

《javascript设计模式》里提到的基于原型的继承方法使用了clone函数,clone函数将一个模板对象的prototype属性指向原型对象然后对模板对象进行new操作。其实在ECMAScript5里已经有一个同样功能的方法了,那就是Object.create()方法。该方法基本与上述clone函数等价,但是可以接受null创建没有原型的对象。


参考资料:

1.《javascript设计模式》

2. 阮一峰的博客 - http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html 

3. 三生石上的博客 - http://www.cnblogs.com/sanshi/archive/2009/07/08/1519036.html 

4. http://blog.endlesscode.com/2010/01/23/javascript-prototype-chain/ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值