【问题标题】:How to get Javascript class fields and functions如何获取 Javascript 类字段和函数
【发布时间】:2014-06-04 19:50:42
【问题描述】:

有什么方法可以在不初始化该类的对象的情况下从 JavaScript 类中获取函数和字段?

var SimpleClass = function() {
    this.type = 'singleClassType';
    this.getType = function() {
        var self = this;
        return self.type;
    }
}

我想获取类型字段(类似于静态)。

我可以做这样的事情,但我真的不想使用类的原型:

SimpleClass.prototype.type = 'customName'

这是我使用的代码:

var Class1 = function(id) {
    this.id = id;
}
Class1.prototype.type = 'class1';

var Class2 = function(id) {
    this.id = id;
}
Class2.prototype.type = 'class2';

var Class3 = function(id) {
    this.id = id;
}
Class3.prototype.type = 'class3';

var Class4 = function(id) {
    this.id = id;
}
Class4.prototype.type = 'class4';

var xml = {},
xmlText = '';
$(document).ready(function(){
    generateObjects();
});

function generateObjects() {
    for(var i=1;i<5;i++){
        if(typeof eval('Class'+i).prototype.getHtml === 'undefined'){
            $.ajax({
                dataType: 'xml',
                url: 'file.xml',
                async: false,
                success: function(data){
                    xmlText = data;
                    addClassData();
                }
            });
            function addClassData(){
                xml['"'+eval('Class'+i).prototype.type+'"'] = xmlText;
            }
            eval('Class'+i).prototype.getHtml = function(){
                var self = this;
                return xml['"'+self.type+'"'];
            }
        }
        var kl =  eval('Class'+i),
            obj = new kl(i);
        console.log(obj.getHtml());
    }
}

【问题讨论】:

  • 我使用Mootools创建类,所以我可以使用initialize方法来改变property.type。但正如我所说,我正在寻找另一种方法来实现这一目标。

标签: javascript class oop object


【解决方案1】:

有什么方法可以在不初始化该类的对象的情况下从 JavaScript 类中获取函数和字段?

没有。除非你 decompile the function,否则解析 JS 代码并查找属性分配。

我可以做这样的事情,但我真的不想使用类的原型:

如果该字段应该在类的所有实例之间共享,那么使用原型没有任何问题。

如果“静态”是指它是类成员而不是实例成员,则也可以将属性直接放在构造函数上:

var SimpleClass = function() {
    this.getType = function() {
        return SimpleClass.type;
        // alternatively, something like `this.constructor.type`
        // but only if you understand when this works and when not
    }
}
SimpleClass.type = 'singleClassType';

【讨论】:

    【解决方案2】:

    像这样访问属性/字段:

    var SimpleClass = function(){
        this.type = 'singleClassType';
        this.getType = function(){
            var self = this;
            return self.type;
        }
    }
    SimpleClass["type"] = 'customName';
    alert(SimpleClass["type"]);
    

    应该也可以。看看this MDN article - property accessors

    查看this MDN article - Working with objects 以获取有关使用 JavaScript 的 OOP 概念的更全面信息,以避免@PaulS 在他的评论中指出的问题。

    【讨论】:

    • 这不会被实例继承(除非你添加并通过constructor
    • 问题是关于获取所有字段和功能,而不仅仅是一个例如类型字段。
    • @pasty SO 的那篇文章展示了如何遍历类的实例。关于主题问题:你是对的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 2014-12-17
    相关资源
    最近更新 更多