用于打印给定对象的原型链的函数

时间:2014-03-04 09:37:28

标签: javascript

有时候我迷失在我的JavaScript对象的prototype链中,所以我希望有一个能够以友好的方式打印给定对象的原型链的函数。

我正在使用Node.js.

function getPrototypeChain(obj) {
   ....
}
var detail = getPrototypeChain(myobject)
console.log(JSON.stringify(detail))

3 个答案:

答案 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()),
 );