19

每当我console.log/console.dir在一个对象上键入时,总是显示的属性之一__proto__是构造函数。

有什么办法可以隐藏这个吗?

4

6 回答 6

7

重新定义console.log:

console.log = function (arg) {
    var tempObj;

    if (typeof arg === 'object' && !arg.length) {
        tempObj = JSON.parse(JSON.stringify(arg));
        tempObj.__proto__ = null;
        return tempObj;
    }

    return arg;
};

这不会修改肯定需要 __proto__ 的原始对象。

于 2012-08-05T16:42:35.553 回答
5
console.debug = function() {
  function clear(o) {

    var obj = JSON.parse(JSON.stringify(o));
    // [!] clone

    if (obj && typeof obj === 'object') {
        obj.__proto__ = null;
        // clear

        for (var j in obj) {
          obj[j] = clear(obj[j]); // recursive
        }
    }
    return obj;
  }
  for (var i = 0, args = Array.prototype.slice.call(arguments, 0); i < args.length; i++) {
    args[i] = clear(args[i]);
  }
  console.log.apply(console, args);
};

var mixed = [1, [2, 3, 4], {'a': [5, {'b': 6, c: '7'}]}, [null], null, NaN, Infinity];
console.debug(mixed);
于 2015-05-06T18:40:59.717 回答
1

使用 Opera 和Dragonfly。在其设置(脚本选项卡)中,您可以取消选中“显示原型”选项。

于 2012-08-05T16:47:10.783 回答
0

虽然.__proto__很重要,但显然有一种方法可以从控制台隐藏东西。这在您尝试执行以下操作时得到证明:

 for (var i in function.prototype) {
    console.log(i+": "+function.prototype[i].toString())
    }

会有一些东西没有记录到控制台,我认为这正是整个主题的意义所在(IMO 的答案应该允许所有原型,以便访问该主题的任何人都可以使用它)。

另外: The__proto__不是构造函数。它是对象的最高优先级原型对象。重要的是不要删除 proto 并将其置之不理,因为如果那里有 JavaScript 依赖的方法,那么整个事情就会一团糟。对于构造函数来说obj.constructor,它并没有搞砸整个该死的东西,它可能只是它的名字,构造函数,想象一下。

于 2016-04-14T19:57:08.020 回答
0

隐藏__proto__是不值得的! (见下文为什么)

var old_log = console.log;
console.log = function ()
{
    function clearProto(obj)
    {
        if (obj && typeof(obj) === "object")
        {
            var temp = JSON.parse(JSON.stringify(obj));
            temp.__proto__ = null;
            for (var prop in temp)
                temp[prop] = clearProto(temp[prop]);
            return temp;
        }
        return obj;
    }
    for (var i = 0; i < arguments.length; ++i)
        arguments[i] = clearProto(arguments[i]);
    old_log.apply(console, arguments);
}

var mixed = [1, [2, 3, 4], {'a': [5, {'b': 6, c: {'d': '7'}}]}, [null], null, NaN, Infinity];
console.log([1, 2, 3], mixed);
old_log([1, 2, 3], mixed); // 4 comparison (original mixed has __proto__)

NaN并且Infinity不能用 JSON 克隆。在 Chrome 中,您还可以在开发工具的右侧获得行号。通过覆盖console.log你会失去它。不值得隐藏__proto__在那个上面!

于 2018-10-23T10:01:16.253 回答
-1

用于Object.create(null)创建对象而不__proto__

如果您只想隐藏显示.__proto__在控制台中的对象上的原型,则不能。虽然我不明白你为什么想要。

顺便说一句,.__proto__不是对象的构造函数,而是它的[[Prototype]] 链接

于 2012-08-05T16:39:23.877 回答