Zag*_*gen 5 javascript node.js sails.js waterline
我正在使用sails.js waterline orm.现在这不是一个特别的帆问题,但我必须放置一些上下文,所以当你创建一个记录时,你会得到一个创建了数据的对象.如果记录具有关联的其他记录(集合),则它具有与返回对象中的那些相关的键,但是这些键是getter/setter,即使这些相关对象不存在数据.
我简化了一些事情只是为了揭示主要观点.
这是我的用户模型:
var User = {
attributes:
status: {type:'string'}
images: {
collection: 'Image'
}
}
Run Code Online (Sandbox Code Playgroud)
让我们失望,我在User模型上执行了一个创建查询,该模型具有关联的图像集合.userRecord是查询返回的内容.如果我在console.log中显示它显示与模型本身相关的属性但不显示相关记录,即使密钥实际存在,您也可以访问它,但即使设置显示,也无法访问console.log或utils.inspec隐藏到真实.
console.log(userRecord)
Run Code Online (Sandbox Code Playgroud)
这是返回的内容
{ name: 'zaggen'}
Run Code Online (Sandbox Code Playgroud)
这应该归还
{ name: 'zaggen',
images: [{
path: 'some-path/img.png'
}]
}
Run Code Online (Sandbox Code Playgroud)
我可以像这样访问隐藏的属性:
console.log(userRecord.images[0].path)
// outputs some-path/img.png
Run Code Online (Sandbox Code Playgroud)
这怎么可能呢?,据我所知,没有办法将信息隐藏到节点中的console.log,除非在__proto__对象中定义属性,但在这种情况下它们不是.
在寻找这个之后,我没有找到任何东西,它非常奇怪,所以我认为这可能是一个很好的问题.它可以帮助我的工作过程,如果我可以console.log这个信息并获取所有数据,现在我可以使用lodash并调用克隆或默认值,我得到它应该的对象.
据我所知,没有办法将信息隐藏到节点中的console.log,除非在proto对象中定义了属性
在ES5中已不再适用.在ES3中确实如此.
请注意,即使在原始javascript中,对象和函数也有隐藏的属性,如.__proto__or .constructor或.prototype?这就像一些原生的javascript对象具有这些神奇的功能(就像设置innerHTML可以调用HTML编译器一样).ES5通过以下方式揭示了所有的魔力Object.defineproperty.
隐藏属性的具体功能console.log()是enumerable.在属性上将其设置为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
Run Code Online (Sandbox Code Playgroud)
还有其他一些有用的功能,例如getter和setter(允许你模拟.innerHTML在写入时调用函数的属性)和writable(允许你将属性设置为只读).有关详细信息,请参阅完整文档:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
| 归档时间: |
|
| 查看次数: |
2014 次 |
| 最近记录: |