悟透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#那些静态对象语言的形式了,这样的代码显得多么文静而优雅啊!
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#那些静态对象语言的形式了,这样的代码显得多么文静而优雅啊!
相关文章推荐
- [转]悟透JavaScript 三.原型真谛
- 悟透JavaScript-原型真谛
- 悟透JavaScript-原型真谛
- 悟透JavaScript之原型真谛 --- (1)
- 悟透JavaScript - 原型真谛
- 悟透JavaScript之原型真谛 ---(3)
- 悟透JavaScript(李站老师)-原型真谛
- 了解javascript编程中的Prototype(原型)
- javascript 之原型、原型链-14
- JavaScript中关联原型链属性特性
- Javascript之旅——第十一站:原型也不好理解?
- 深入理解javascript原型和闭包(11)——执行上下文栈
- javascript 用原型继承来实现对象系统
- Javascript中的对象和原型(二)
- JavaScript中的原型链
- 深入理解javascript原型和闭包(6)——继承
- JavaScript-原型继承工作原理
- 深入理解javascript原型和闭包(14)——从【自由变量】到【作用域链】
- JavaScript面向对象(二)——成员属性、静态属性、原型属性与JS原型链
- JavaScript 原型总结四 隐式原型