有时候我迷失在我的JavaScript对象的prototype
链中,所以我希望有一个能够以友好的方式打印给定对象的原型链的函数。
我正在使用Node.js.
function getPrototypeChain(obj) {
....
}
var detail = getPrototypeChain(myobject)
console.log(JSON.stringify(detail))
答案 0 :(得分:9)
此函数清楚地显示任何对象的原型链:
function tracePrototypeChainOf(object) {
var proto = object.constructor.prototype;
var result = '';
while (proto) {
result += ' -> ' + proto.constructor.name;
proto = Object.getPrototypeOf(proto)
}
return result;
}
var trace = tracePrototypeChainOf(document.body)
alert(trace);
tracePrototypeChainOf(document.body)
返回"-> HTMLBodyElement -> HTMLElement -> Element -> Node -> EventTarget -> Object"
答案 1 :(得分:5)
您可以使用以下内容:
function printPrototype(obj, i) {
var n = Number(i || 0);
var indent = Array(2 + n).join("-");
for(var key in obj) {
if(obj.hasOwnProperty(key)) {
console.log(indent, key, ": ", obj[key]);
}
}
if(obj) {
if(Object.getPrototypeOf) {
printPrototype(Object.getPrototypeOf(obj), n + 1);
} else if(obj.__proto__) {
printPrototype(obj.__proto__, n + 1);
}
}
}
http://jsfiddle.net/5fv1tv1x/1/
这样称呼:
printPrototype(myObj);
可能需要进行一些修改以满足您的确切需求。在节点中,你可能还需要一些额外的防护(我在Chrome中测试过,因此我只需要在递归之前防止'obj'未定义)。
答案 2 :(得分:0)
function protoChain(o) {
var chain = [];
(function protoChainImpl(o) {
if (o == null) {
return;
}
var proto = Object.getPrototypeOf(o);
if (proto) {
chain.push(proto.hasOwnProperty('constructor') ? proto.constructor.name : 'undefined');
return protoChainImpl(proto);
}
})(o);
return chain;
}
class ExampleParent {}
class Example extends ExampleParent {}
document.write(
'function(){}: ', protoChain(function() {}),
'<br>',
'[]: ', protoChain([]),
'<br>',
'Example: ', protoChain(new Example()),
);