您的位置:首页 > Web前端 > JavaScript

悟透JavaScript之原型真谛---(2)

2012-08-19 18:25 211 查看
可是,如果我们将这些代码写成一个通用函数,而那个函数躯壳也就成了函数内的函数,这个内部函数不就可以在外层函数退出作用域后自动消亡吗?而且,我们可以将原型对象作为通用函数的参数,让通用函数返回创建的对象。我们需要的就是下面这个形式:
function
New(aClass, aParams) //通用创建函数
{

function
new_() //定义临时的中转函数壳

{

aClass.Create.apply(this,
aParams); //调用原型中定义的的构造函数,中转构

造逻辑及构造参数

};

new_.prototype = aClass; //准备中转原型对象

return new
new_(); //返回建立最终建立的对象
};
var
Person = //定义的类
{

Create:
function(name, age)

{

this.name = name;

this.age = age;

},

SayHello:
function()

{

alert("Hello, I'm " +
this.name);

},

HowOld:
function()

{

alert(this.name
+ " is " + this.age + " years old.");

}
};
var
BillGates = New(Person, ["Bill Gates", 53]); //调用通用函数创建对象,并以数
组形式传递构造参数
BillGates.SayHello();
BillGates.HowOld();
alert(BillGates.constructor == Object); //输出:true

这里的通用函数New()就是一个“语法甘露”!这个语法甘露不但中转了原型对象,还中转了构造函数逻辑及构造参数。

有趣的是,每次创建完对象退出New
函数作用域时,临时的new_函数对象会被自动释放。由于new_的prototype
属性被设置为新的原型对象,其原来的原型对象和new_之间就已解开了引用链,临时函数及其原来的原型对象都会被正确回收了。上面代码的最后一句证明,新创建的对象的constructor
属性返回的是Object
函数。其实新建的对象自己及其原型里没有constructor
属性,那返回的只是最顶层原
型对象的构造函数,即Object。

有了 New
这个语法甘露,类的定义就很像C#那些静态对象语言的形式了,这样的代码显得多么文静而优雅啊!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: