我正在使用JavaScript Framework MooTools,可以在其中创建类似于面向对象的类。
我不知道是否可以以某种方式警告班级中的类名'TestClass'。
var TestClass = new Class({
Extends: Module,
initialize: function() {
//constructor which is called and should alert the Classname itself
alert(this.classname); (pseudocode)
}
});
有人有想法吗?
提前谢谢!答案 0 :(得分:3)
作为一种解决方法,这很容易,但是一个类可以是匿名的(就像一个函数),然后反射就毫无意义。
将(a)宿主对象的可枚举与实例的构造函数进行比较。不是便宜的东西,但仍然。如果使用深度命名空间,则效果不佳,例如:window.App.admin.controllers.view.Login
,因为您需要以递归方式查找它或知道它由window.App.admin.controllers.view
// define the class in the current scope / global object
this.foo = new Class();
// directly into scope
var Foo = new Class();
// define the class in a namespace
var namespace = {
bar: new Class()
};
// get the variable class name we need to use from any source into a variable...
var dynamic = 'foo';
// make the instances
var instance1 = new this[dynamic]();
var instance2 = new namespace.bar();
var instance3 = new Foo();
function getClassNameOfInstance(mootoolsClassInstance, context) {
// query the context (this or custom object) for the instance we are working with
return Object.keyOf(context || this, mootoolsClassInstance.constructor);
}
// use it on the global object
console.log("instance1 is: ", getClassNameOfInstance(instance1)); // foo
// use it on the namespace object
console.log("instance2 is: ", getClassNameOfInstance(instance2, namespace)); // foo
// use it on the current scope.
console.log("instance3 is: ", getClassNameOfInstance.call(this, instance3)); // Foo
在此处查看:http://jsfiddle.net/dimitar/c8pR4/
这是一个匿名类的示例,如果您不打算多次实例化某些内容,这是一个有用的模式:
var instance = new (new Class({ ... }))(args);
我刚才写过这篇文章 - http://fragged.org/working-with-dynamic-class-names-in-mootools_1395.html
更好/更明智的方法是手动为所有需要它们的类提供ID,例如:
var Request.CORS = new Class('Request.CORS', { ... });
var i = new Request.CORS();
i.$className; // 'Request.CORS'
这是AMD(define('id', [deps], fn)
),DOJO(declare('id', [deps], obj)
)等常见的模式。
要扩展您的MooTools以支持您可以执行以下操作:
http://jsfiddle.net/rnbW6/5/ - 将添加Request.JSON.prototype.$className
属性或getter(如果可用,则通过Object.defineProperty
配置)。
如果你走这条路,你甚至可以做一个Class工厂,这样你的依赖解析就像Class.require('Request.CORS')
一样,你不需要将你的定义保存到类闭包中引用之外的全局变量中。