草庐IT

javascript - console.log 或 utils.inspect 的隐藏属性

coder 2025-02-28 原文

我正在使用 sails.js waterline orm。现在这不是一个特别的 sails 问题,但我必须放置一些上下文,所以当你创建一个记录时,你会得到一个包含创建数据的对象。如果该记录关联了其他记录(集合),则它具有与返回对象中的记录相关的键,但这些键是 getter/setter,即使这些相关对象没有数据。

我简化了一些事情只是为了揭示要点。

这是我的用户模型:

var User = {
 attributes: 
   status: {type:'string'}
   images: {
     collection: 'Image'
   }
}

假设,我在一个用户模型上执行了一个创建查询,该模型关联了一个图像集合。 userRecord 是查询返回的内容。 如果我 console.log 出来,它会显示与模型本身相关的属性 但不是关联的记录,即使 key 确实存在,您也可以 访问它但对 console.log 或 utils.inspec 不可见,即使将 show hidden 设置为 true。

console.log(userRecord)

这是返回的内容

{ name: 'zaggen'}

这是应该返回的内容

{ name: 'zaggen',
  images: [{ 
    path: 'some-path/img.png'
  }] 
 }

我可以像这样访问隐藏属性:

console.log(userRecord.images[0].path) 
// outputs some-path/img.png

这怎么可能?据我所知,没有办法将信息隐藏到 Node 的 console.log 中,除非在 __proto__ 对象中定义了属性,但是在这种情况下,它们不是。

在搜索这个之后我没有找到任何东西而且它很奇怪所以我认为这可能是一个很好的问题。如果我可以控制台记录此信息并获取所有数据,这将对我的工作流程有所帮助,现在我可以使用 lodash 并调用克隆或默认值,并且我得到了应有的对象。

最佳答案

as far as i know there is no way to hide info to the console.log in node, except maybe when the properties are defined in the proto object

在 ES5 中不再如此。在 ES3 中确实如此。

请注意,即使在原始的 javascript 中,对象和函数也具有隐藏属性,如 .__proto__.constructor.prototype?就像一些原生的 javascript 对象具有这些神奇的功能(比如设置 innerHTML 可以调用 HTML 编译器)。 ES5 通过 Object.defineproperty 公开了所有这些魔法.

console.log() 中隐藏属性的特定功能是可枚举。在属性上将其设置为 false 可使其对 for..in 隐藏(不再需要 .hasOwnProperty()):

var foo = {a:1}
Object.defineProperty(foo,'b',{
    enumerable: false, // hide it from for..in
    value: 2
})

console.log(foo); // prints out {a:1}
console.log(foo.b); // prints out 2

还有其他有用的特性,例如 getter 和 setter(允许您模拟像 .innerHTML 这样的属性,在您写入时调用函数)和 writable(允许您将属性设置为只读)。有关详细信息,请参阅完整文档:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

关于javascript - console.log 或 utils.inspect 的隐藏属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32029867/

有关javascript - console.log 或 utils.inspect 的隐藏属性的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  3. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  4. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  5. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  6. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  7. ruby - Chef Ruby 遍历 .erb 模板文件中的属性 - 2

    所以这可能有点令人困惑,但请耐心等待。简而言之,我想遍历具有特定键值的所有属性,然后如果值不为空,则将它们插入到模板中。这是我的代码:属性:#===DefaultfileConfigurations#default['elasticsearch']['default']['ES_USER']=''default['elasticsearch']['default']['ES_GROUP']=''default['elasticsearch']['default']['ES_HEAP_SIZE']=''default['elasticsearch']['default']['MAX_OP

  8. ruby - 获取数组中的值并最小化某个类属性的最优雅的方法是什么? - 2

    假设我有以下类(class):classPersondefinitialize(name,age)@name=name@age=ageenddefget_agereturn@ageendend我有一组Person对象。是否有一种简洁的、类似于Ruby的方法来获取最小(或最大)年龄的人?如何根据它对它们进行排序? 最佳答案 这样做会:people_array.min_by(&:get_age)people_array.max_by(&:get_age)people_array.sort_by(&:get_age)

  9. ruby-on-rails - 为模型创建状态属性 - 2

    我想为我的Task模型创建一个status属性,该属性将按以下顺序指示它在三部分进度中的位置:打开=>进行中=>完成。它的工作方式类似于亚马逊包裹的交付方式:已订购=>已发货=>已交付。我想知道设置此属性的最佳方法是什么。我可能是错的,但创建三个独立的bool属性似乎有点多余。实现此目标的最佳方法是什么? 最佳答案 Rails4有一个内置的enummacro.它使用单个整数列并映射到键列表。classOrderenumstatus:[:ordered,:shipped,:delivered]end状态映射如下:{ordered:0,

  10. Ruby 默认将 IRB 配置为 Pretty_Inspect - 2

    我是ruby​​的新手,正在配置IRB。我喜欢pretty-print(需要'pp'),但总是输入pp来漂亮地打印它似乎很麻烦。我想做的是默认情况下让它漂亮地打印出来,所以如果我有一个var,比如说,'myvar',然后键入myvar,它会自动调用pretty_inspect而不是常规检查。我从哪里开始?理想情况下,我将能够向我的.irbrc文件添加一个自动调用的方法。有什么想法吗?谢谢! 最佳答案 irb中默认pretty-print对象正是hirb被迫去做。Theseposts解释hirb如何将几乎所有内容转换为ascii表。虽

随机推荐