Javascript 分析三.js

Javascript 分析三.js,javascript,inheritance,three.js,Javascript,Inheritance,Three.js,我想分析three.js库的类。我有一个函数,可以找出给定的类是否依赖于另一个类 function getParent (className) { var parent = null; var object = new THREE[className](); for (var a in THREE) { if (typeof THREE[a] === "function" && object instanceof THREE[a] &am

我想分析three.js库的类。我有一个函数,可以找出给定的类是否依赖于另一个类

function getParent (className) {
    var parent = null;
    var object = new THREE[className]();

    for (var a in THREE) {
        if (typeof THREE[a] === "function" && object instanceof THREE[a] && a !== className) {
            parent = a;

            break
        }
    }
    return(parent)
}
我还想要一个返回2个数组的函数。一个具有属性,一个具有方法。当在“对象”上迭代时,我可以确定成员的类型,但我如何检查它,它不是继承的? 如果parent存在,并且我存储了它的引用,则否定parentObject.hasOwnProperty的结果不起作用

for (var member in object) {
    if (typeof object[member] === "function") {
        if (!parentObject.hasOwnProperty(member)) {
            methods.push(member)
        }
    }
    else {
        //...
    }
}

hasOwnProperty
不会检查原型链,因此如果它返回true,您就知道该属性不是继承的。您不需要检查父对象成员

if (object.hasOwnProperty(member))
    methods.push(member)
else
    ...

有关更多详细信息-

我希望您已经了解了如何为他们进行继承

这不适用于多级继承。最好使用类似

function getParent (className) {
    var proto = THREE[className].prototype,
        parproto = Object.getPrototypeOf(proto);

    for (var a in THREE)
        if (typeof THREE[a] === "function" && THREE[a].prototype === parproto)
            return a;
    return null;
}
但请注意,这只检测原型继承,而没有像mixin继承这样的东西。由于原型继承是在Three.js中完成的,因此您也可以

我可以确定成员是什么类型的,但如何检查它是否不是继承的?如果parent存在,并且我存储了它的引用,则否定parentObject.hasOwnProperty的结果不起作用

for (var member in object) {
    if (typeof object[member] === "function") {
        if (!parentObject.hasOwnProperty(member)) {
            methods.push(member)
        }
    }
    else {
        //...
    }
}
我不知道在您的案例中,parentObject是什么,但特别是对于方法,实例可能确实从其原型继承了该方法,即没有将其作为自己的属性

你最好这样做:

function describeProperties(className) {
    try {
        var o = new THREE[className](), // do you know appropriate arguments?
            p = Object.getPrototypeOf(o);
    } catch(e) { // probably constructor call was not successful
        o = p = THREE[className].prototype;
    }
    var props = {};
    for (var prop in o) {
        var desc = [];
        desc.push( (typeof o[prop] == "function") ? "method" : "value");
        if (!(prop in p)) // does not appear on the prototype
            desc.push("instance-specific") // so was added in constructor
        if (o !== p && o.hasOwnProperty(prop) && prop in p)
            desc.push("defaulted");
        if (prop in Object.getPrototypeOf(p)) {
            desc.push("inherited") // from parent class
            if (p.hasOwnProperty(prop)) // but also in own prototype
                desc.push("overwritten");
        }
        props[prop] = desc.join(" ");
    }
    return props;
}

我很困惑你为什么要这么做,你会从中获得什么?JavaScript使用原型设计,因此它不像其他面向对象语言那样具有类或继承。我正在将此库绑定到强类型函数语言,目前有一些类的文档记录不完整,因此我必须找到一种方法来分析它们,因为我不想花很多时间在源代码中搜索。@neelsg:原型设计是一种继承形式。即使JS[还]没有
关键字,您也可以(而且确实)使用该模式。