【问题标题】:hiding the __proto__ property in Chrome's console在 Chrome 的控制台中隐藏 __proto__ 属性
【发布时间】:2012-08-02 19:44:32
【问题描述】:

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

有什么办法可以隐藏吗?

【问题讨论】:

  • __proto__ 是构造函数吗?我简直不敢相信。
  • 你不想隐藏它,原型中的内容与其他属性一样重要!
  • @qwertymk .__proto__ 是对对象原型的引用,而不是其构造函数。
  • @qwertymk 在您的第一条评论中,您说它指的是构造函数,但我告诉您它指的是原型,而不是构造函数。
  • 如果您不想检查整个对象,请不要记录它,而只记录您感兴趣的内容。

标签: javascript debugging google-chrome console


【解决方案1】:

重新定义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__ 的原始对象。

【讨论】:

  • 我以为它会显示一个null 条目,但不知何故,将其设置为null__proto__ 会减少。
  • 这将有有限的用途。不会显示非 JSON 友好的值。
  • 我试过了,但控制台现在没有显示任何东西了:S
【解决方案2】:
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);

【讨论】:

  • 像魅力一样工作 - 谢谢:)
  • 而且(据我所知..)不会从实际对象中删除原型 - 使用起来很安全:)
  • 我收回它!!!!不要这样做!!!!它确实弄乱了对象-只是花了一整天的时间与select2战斗-绝望地从console.debug切换到console.log-我所有的麻烦都消失了:)
【解决方案3】:

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

【讨论】:

  • 这可能是正确的,但问题被标记为 Google Chrome。
【解决方案4】:

虽然.__proto__ 很重要,但显然有一种方法可以在控制台中隐藏内容。当您尝试这样做时会证明这一点:

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

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

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

【讨论】:

    【解决方案5】:

    隐藏__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__)
    

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

    【讨论】:

      【解决方案6】:

      使用Object.create(null) 创建没有__proto__ 的对象

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

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

      【讨论】:

      • 如果我可以跑题,对于var o = {};,为什么是o.hasOwnProperty('__proto__') //false,但'__proto__' in o // true
      • @ŠimeVidas 我不知道,这并不是说它不是非标准、已弃用和脆弱的功能。它在 safari 中返回 true,在 firefox、chrome 和 opera 中返回 false
      • @Esailija:Opera 根本不支持该属性,所以true 不太可能:-)
      • @Bergi 大声笑我有 9.80(我知道,仪式)并且它确实支持它,但返回 false:P
      • @Esailija 是的,这就是原因。它不是原生 ECMAScript 属性,因为它不符合语言的属性规则。
      猜你喜欢
      • 2018-09-11
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 2016-03-03
      • 2016-02-17
      • 2020-02-01
      相关资源
      最近更新 更多