Javascript Node.js v5.1.0';参数';不允许我访问嵌套数组属性
我用两种不同的方式实例化了一个类:Javascript Node.js v5.1.0';参数';不允许我访问嵌套数组属性,javascript,node.js,arguments,Javascript,Node.js,Arguments,我用两种不同的方式实例化了一个类: _client.setAppAuth(clientId, clientSecret, tokenTtl) _client.setAppAuth({ clientId: clientId, clientSecret: clientSecret, tokenTtl: tokenTtl }) 我已经定义了一个setter/getter和一个helper方法: Object.defineProperty(MyClient.prototype,
_client.setAppAuth(clientId, clientSecret, tokenTtl)
_client.setAppAuth({
clientId: clientId,
clientSecret: clientSecret,
tokenTtl: tokenTtl
})
我已经定义了一个setter/getter和一个helper方法:
Object.defineProperty(MyClient.prototype, "appAuth", {
get: function() {
return appAuth
},
set: function(opts) {
console.log(arguments)
}
})
MyClient.prototype.setAppAuth = function(opts) {
this.appAuth = typeof opts === 'object' ? opts : arguments
}
我正在尝试使用从该实例化检索参数
在console.log()
中,我得到以下信息:
{ '0':
{ '0': 'YXA6GXSAACS2EeOYd20aP4G6Lw',
'1': 'YXA66BeEvgNpJBwc4PAbvZZGTVS_SSw',
'2': 3600 } }
{ '0':
{ clientId: 'YXA6GXSAACS2EeOYd20aP4G6Lw',
clientSecret: 'YXA66BeEvgNpJBwc4PAbvZZGTVS_SSw',
tokenTtl: 3600 } }
这看起来正符合我的期望。但奇怪的是:
console.log(arguments[0])
给我这个:
{ '0': 'YXA6GXSAACS2EeOYd20aP4G6Lw',
'1': 'YXA66BeEvgNpJBwc4PAbvZZGTVS_SSw',
'2': 3600 }
{ clientId: 'YXA6GXSAACS2EeOYd20aP4G6Lw',
clientSecret: 'YXA66BeEvgNpJBwc4PAbvZZGTVS_SSw',
tokenTtl: 3600 }
但当我这样做的时候:
console.log(arguments[0][0]) // or arguments[0]["0"]
我得到:
TypeError: Cannot read property '0' of null
我意识到arguments
实际上不是数组(虽然它有一个length属性),难道我不应该像访问对象一样访问内部属性值吗<代码>参数类型[0]返回对象
?有什么好处?这是一个节点实现错误,还是我做得不对?如何从参数[0]
中获取对象值
更新 像这样尝试/捕捉:
try {
console.log(opts, Object.keys(opts))
} catch (e) {
}
注销:
{ '0': 'YXA6GXSAACS2EeOYd20aP4G6Lw',
'1': 'YXA66BeEvgNpJBwc4PAbvZZGTVS_SSw',
'2': 3600 } [ '0', '1', '2' ]
{ clientId: 'YXA6GXSAACS2EeOYd20aP4G6Lw',
clientSecret: 'YXA66BeEvgNpJBwc4PAbvZZGTVS_SSw',
tokenTtl: 3600 } [ 'clientId', 'clientSecret', 'tokenTtl' ]
很明显,它似乎在某个地方试图通过传递null参数来执行setter函数?但是当记录
console.log(e)
或e.stack
时,没有输出。catch
块从未到达?很明显,这里还发生了其他事情-将剥离整个库并尝试使用SSCCE进行复制。您使用了两次参数
,这毫无意义。在setter中,您应该只使用opts
,因为只有一个参数。在setter中,您有opts===arguments[0]
。这是您从setAppAuth
传入的值,即==typeof opts===object'?选项:参数
。它要么有.clientId
(etc)属性(当它是obj
)要么有索引(当它是参数时)。哦,等等,我现在看到你的问题了。当您尝试使用obj[0]
而不是arguments[0][0]
时,是否也会出现错误?“typeof arguments[0]
返回object
?给出了什么?”-是的,typeof null==“object”
(出于一些奇怪的历史原因)。无论如何,您在任何地方都没有执行\u client.setAppAuth(null)
,是吗?或者,clientId
有时是空的吗?所以做了一些检查,我想你的意思是opts[0]
不是obj[0]
。使用选项[0]
时出现相同错误。否,clientId
从不为空-当我注销plainopts
时,我得到的有效负载与最终的console.log语句相同(与参数[0]
相同)。下面是对绘图的进一步加厚:记录Object.keys(opts)
使我无法将未定义或null转换为Object
…您使用参数两次,这毫无意义。在setter中,您应该只使用opts
,因为只有一个参数。在setter中,您有opts===arguments[0]
。这是您从setAppAuth
传入的值,即==typeof opts===object'?选项:参数
。它要么有.clientId
(etc)属性(当它是obj
)要么有索引(当它是参数时)。哦,等等,我现在看到你的问题了。当您尝试使用obj[0]
而不是arguments[0][0]
时,是否也会出现错误?“typeof arguments[0]
返回object
?给出了什么?”-是的,typeof null==“object”
(出于一些奇怪的历史原因)。无论如何,您在任何地方都没有执行\u client.setAppAuth(null)
,是吗?或者,clientId
有时是空的吗?所以做了一些检查,我想你的意思是opts[0]
不是obj[0]
。使用选项[0]
时出现相同错误。否,clientId
从不为空-当我注销plainopts
时,我得到的有效负载与最终的console.log语句相同(与参数[0]
相同)。下面是对绘图的进一步加厚:记录Object.keys(opts)
使我无法将未定义或null转换为Object
。。。