首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >分析three.js

分析three.js
EN

Stack Overflow用户
提问于 2014-06-09 21:02:27
回答 2查看 80关注 0票数 0

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

代码语言:javascript
运行
复制
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个数组的函数。一个包含属性,另一个包含方法。当迭代"object“时,我可以确定成员是什么类型,但是我如何检查它不是继承的?如果父对象存在,并且我存储了它的引用,则否定parentObject.hasOwnProperty的结果是不起作用的。

代码语言:javascript
运行
复制
for (var member in object) {
    if (typeof object[member] === "function") {
        if (!parentObject.hasOwnProperty(member)) {
            methods.push(member)
        }
    }
    else {
        //...
    }
}
EN

回答 2

Stack Overflow用户

发布于 2014-06-09 22:20:40

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

代码语言:javascript
运行
复制
if (object.hasOwnProperty(member))
    methods.push(member)
else
    ...

有关更多细节,请访问Object.prototype.hasOwnProperty()

票数 0
EN

Stack Overflow用户

发布于 2014-06-09 23:00:20

我希望您已经了解了how classes work in JavaScript以及如何为它们完成继承。

(var A in THREE) { if (

if === "function“&& object instanceof THREEa && a !== className) {= a;

这不适用于多级继承。最好使用像这样的东西

代码语言:javascript
运行
复制
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;
}

但请注意,这只检测原型继承,而不是像混合继承这样的东西。因为原型继承是在Three.js中使用the standard pattern完成的,所以您也可以使用just search the code

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

我不知道在你的例子中parentObject是什么,但特别是对于方法来说,它可能是一个实例从它的原型继承了这个方法,也就是说,没有把它作为自己的属性。

你最好这样做:

代码语言:javascript
运行
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24120910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档