MooTools在Class(而不是CSS)中获取Classname?

时间:2013-12-29 17:36:03

标签: javascript mootools

我正在使用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)
    }
});

有人有想法吗?

提前谢谢!

1 个答案:

答案 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')一样,你不需要将你的定义保存到类闭包中引用之外的全局变量中。