有没有办法从"类"反映JavaScript属性和方法?或功能,而不是来自对象?

时间:2017-05-29 10:31:20

标签: javascript reflection

从JavaScript对象中获取反射非常容易,就像下面的代码一样。

var getAllMembers = function (obj) {
    var members = {};
    members.properties = [];
    members.methods = [];

    for (var prop in obj) {
        if (typeof obj[prop] != 'function')
            members.properties.push(prop);
        else members.methods.push(prop);
    }
    return members;
}

function demo_class(na, nb) {
    this.a = na;
    this.b = nb;

    this.funca = function () {
        console.log(this.a);
    }
    this.funcb = function () {
        console.log(this.b);
    }
}

var x = new demo_class(1234, 4321);

var members = getAllMembers(x);

console.log(members.properties);  // [ 'a', 'b' ]
console.log(members.methods);     // [ 'funca', 'funcb' ]

我的问题是:有没有办法从类或函数中获取属性和方法,而不是从对象中获取?例如,像这样:

var members = getAllMembers(demo_class); // Only can get '[] []'

2 个答案:

答案 0 :(得分:0)

在Javascript中,一切都是对象。它不存在类概念。因此,每次使用new运算符(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new)时,它都会使用函数作为构造函数返回一个对象。

您可以使用Prototype概念得到近似值。您在原型中定义方法而不是构造函数本身。

function Person(name, family) {
    this.name = name;
    this.family = family;
}

Person.prototype.getFull = function() {
    return this.name + " " + this.family;
};

这是一篇解释它的帖子https://www.thecodeship.com/web-development/methods-within-constructor-vs-prototype-in-javascript/

答案 1 :(得分:0)

在javascript中没有真正的类概念,因为它是一种原型语言。函数是一个对象。

您可以做的是测试您的对象是否具有命名函数构造函数,以测试它是否是由函数构造的对象。如果没有,您可以创建一个实例来获取您已经执行过的属性:

注意:只有在使用通过关键字函数定义的类构造函数(不是通过另一个命名函数构造)时,这才有效。如果不使用@Transactional函数,您的函数也将从原型链中获取所有继承的属性。

hasOwnProperty()