JS
//【示例1】下面示例就是一个简单的元类,它包含了一个返回的类。
function O(x){ // 元类
return function(){ // 返回类
this.x = x; // 返回类的属性
this.get = function(){ // 返回类的方法
alert(this.x);
}
}
}
var o = new O(1); // 实例化元类
var f = new o(); // 实例化元类返回的类
f.get(); // 调用返回类的方法get(),返回1
//【示例2】实际上,JavaScript核心对象Function就是一个元类,虽然说它没有返回值,但是可以通过字符串的形式创建返回类。
var O = new Function("this.x=1;this.y=2") // 实例化之后返回的是类
var o = new O(); // 实例化返回类
alert(o.x); // 调用实例的属性值,返回1
//【示例3】下面实例是一个比较复杂的元类,元类参数值包含类类型,返回值也是类类型。
function F( x, y ){ // 定义作为参数的类
this.x = x;
this.y = y;
}
F.prototype.add = function(){ // 类的原型方法
alert( this.x + this.y );
}
function O( o, x, y ){
// 创建元类,第一个参数为类类型,第2、3个参数为数值
this.say = function(){ // 元类的本地方法
alert( "元类" );
}
return function(){ // 返回类
this.say = function(){ // 返回类的本地方法
alert( "返回类" );
}
var a = new o( x, y ); // 实例化参数类
for( var i in a ){ // 通过实例继承法,继承参数类给返回类
this[i] = a[i]; // 此时this关键字指返回类的当前对象
}
}
}
var A = new O( F, 1, 2 ); // 实例化元类
var B = new A(); // 实例化元类返回类
A.say(); // 如果直接调用元类的本地方法,将提示编辑错误
B.say(); // 返回字符串"返回类",调用返回类自己的本地方法
B.add(); // 返回数值3,调用参数类的原型方法
alert( B.x ); // 返回数值1,调用参数类的本地属性
alert( B.y ); // 返回数值2,调用参数类的本地属性
function F(){ // 类F
this.x = 1; // 本地属性
return 2; // 返回值
}
var f = new F(); // 实例化类F
alert(f.x); // 返回1,可以访问
alert(F()); // 返回2,可以访问
function F(){ // 类F
this.x = 1; // 本地属性
return function(){ // 返回函数
return this.x; // 可以访问本地属性值
};
}
F.prototype.y = function(){ // 类的原型方法
alert(3);
}
var f = new F(); // 实例化类F
alert(f.x); // 访问本地属性x失败,返回undefined
alert(F()()); // 调用返回的函数,返回1,说明它可以访问本地属性x
alert(f.y()); // 提示编辑错误,没有这个成员