我想分析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个数组的函数。一个有属性,一个有方法。当迭代" object"时,我可以确定该成员的类型,但我如何检查它,它不是继承的? 如果parent存在并且我存储了它的引用,则否定parentObject.hasOwnProperty的结果不起作用。
for (var member in object) {
if (typeof object[member] === "function") {
if (!parentObject.hasOwnProperty(member)) {
methods.push(member)
}
}
else {
//...
}
}
答案 0 :(得分:0)
hasOwnProperty
不检查原型链,因此如果它返回true,则表示该属性不继承。您不需要检查父对象成员。
if (object.hasOwnProperty(member))
methods.push(member)
else
...
答案 1 :(得分:0)
我希望您已了解how classes work in JavaScript以及如何为他们完成继承。
for (var a in THREE) { if (typeof THREE[a] === "function" && object instanceof THREE[a] && a !== className) { parent = a;
这对多级继承不起作用。更好地使用像
这样的东西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中的the standard pattern完成的,因此您可以just search the code
我可以确定该成员的类型,但我如何检查它,它不是继承的?如果parent存在并且我存储了它的引用,则否定parentObject.hasOwnProperty的结果不起作用。
我不知道你的情况是什么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;
}