悟透JavaScript之原型扩展 ---(1)

想必君的悟性极高,可能你会这样想:如果在JavaScript 内置的那些如Object Function 等函数的prototype 上添加些新的方法和属性,是不是就能扩展JavaScript 的功能呢?那么,恭喜你,你得到了!在 AJAX 技术迅猛发展的今天,许多成功的AJAX 项目的JavaScript 运行库都大量扩展了内置函数的prototype 功能。比如微软的ASP.NET AJAX,就给这些内置函数及其prototype 添加了大量的新特性从而增强了JavaScript 的功能。

我们来看一段摘自MicrosoftAjax.debug.js 中的代码:

String.prototype.trim = function String$trim() {

if (arguments.length !== 0) throw Error.parameterCount();

return this.replace(/^\s+|\s+$/g, '');

}

这段代码就是给内置String 函数的prototype 扩展了一个trim 方法,于是所有的String 类对象都有了trim 方法了。有了这个扩展,今后要去除字符串两段的空白,就不用再分别处理了,因为任何字符串都有了这个扩展功能,只要调用即可,真的很方便。

当然,几乎很少有人去给Object prototype 添加方法,因为那会影响到所有的对象,除非在你的架构中这种方法的确是所有对象都需要的。

 

前两年,微软在设计AJAX 类库的初期,用了一种被称为闭包”(closure)的技术来模拟。其大致

模型如下:

function Person(firstName, lastName, age)

{

//私有变量:

var _firstName = firstName;

var _lastName = lastName;

//公共变量:

this.age = age;

//方法:

this.getName = function()

{

return(firstName + " " + lastName);

};

this.SayHello = function()

{

alert("Hello, I'm " + firstName + " " + lastName);

};

};

var BillGates = new Person("Bill", "Gates", 53);

var SteveJobs = new Person("Steve", "Jobs", 53);

BillGates.SayHello();

SteveJobs.SayHello();

alert(BillGates.getName() + " " + BillGates.age);

alert(BillGates.firstName); //这里不能访问到私有变量

 

很显然,这种模型的类描述特别象C#语言的描述形式,在一个构造函数里依次定义了私有成员、公共属性和可用的方法,显得非常优雅嘛。特别是闭包机制可以模拟对私有成员的保护机制,做得非常漂亮。所谓的闭包,就是在构造函数体内定义另外的函数作为目标对象的方法函数,而这个对象的方法函数反过来引用外层外层函数体中的临时变量。这使得只要目标对象在生存期内始终能保持其方法,就能间接保持原构造函数体当时用到的临时变量值。尽管最开始的构造函数调用已经结束,临时变量的名称也都消失了,但在目标对象的方法内却始终能引用到该变量的值,而且该值只能通这种方法来访问。即使再次调用相同的构造函数,但只会生成新对象和方法,新的临时变量只是对应新的值,和上次那次调用的是各自独立的。的确很巧妙!

但是前面我们说过,给每一个对象设置一份方法是一种很大的浪费。还有,闭包这种间接保持变量值的机制,往往会给JavaSript 的垃圾回收器制造难题。特别是遇到对象间复杂的循环引用时,垃圾回收的判断逻辑非常复杂。无独有偶,IE 浏览器早期版本确实存在JavaSript 垃圾回收方面的内存泄漏问题。再加上闭包模型在性能测试方面的表现不佳,微软最终放弃了闭包模型,而改用原型模型。正所谓

得必有失嘛。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值