javascript中定义后如何获取对象成员值
How to get an object member value after it is defined in javascript
我在 javascript 中有一个对象:
var a = {
n1: 1,
n2: 2
}
我想获取a.n3
的值,但是n3
稍后会添加到对象中。
如何在不使用任何循环并导致任何错误的情况下获取 n3
的值?
编辑
对象 a
是一种容器,来自不同范围的不同脚本正在异步添加变量(我正在使用 requireJS 来维护脚本)。
我的一个脚本 init.js
期望从对象中获取 属性 n3
,但是 属性 n3
被添加到对象中一个不同的脚本 swatchRenderer.js
,不幸的是,在 init.js
之后被称为 。因此 init.js
脚本没有得到值 n3
。
那么有什么方法可以阻止 init.js
中值的获取。
注意:我无法更改脚本的加载顺序。
如果对象 a
中不存在,a.n3
的值将是 undefined
。因此,您可以使用 if
条件来防止错误。
var a = {
n1: 1,
n2: 2
}
if(a.n3){
console.log('value found first');
}
a.n3 = 10;
if(a.n3){
console.log('value found second');
}
但是假设 n3
是一个 boolean
值,那么这个 if
条件将不起作用,所以最好的方法可能是检查类型 undefined
,
var a = {
n1: 1,
n2: 2
}
if(typeof a.n3 !== 'undefined'){
console.log('value found first');
}
a.n3 = false;
if(typeof a.n3 !== 'undefined'){
console.log('value found second');
}
var value = a.n3;
如果value没有定义,那么n3还没有定义,如果定义了,那么你得到的就是value。
如果你想 运行 一个函数在它被改变时给定 n3
的新值,一个选择是使用 getter/setter:
const a = {
n1: 1,
n2: 2,
get n3() {
return this._n3;
},
set n3(val) {
this._n3 = val;
console.log('saw change, new val: ' + val);
},
};
console.log('start');
a.n3 = 'foo';
console.log('end');
但这通常不是什么值得依赖的东西——当对象改变时触发外部的东西会更好。
更多 details/examples MDN
使用JavaScript的这个功能(这只是例子)
function resolveAfter2Seconds() {
return new Promise(resolve => {
setTimeout(() => {
resolve('resolved');
}, 2000);
});
}
var obj = {
n1: 2,
n2: 3
}
async function asyncCall() {
console.log('calling');
var result = await resolveAfter2Seconds();
console.log(result);
if (obj.n3) {
console.log("obj.n3 found");
//Here do your task
return;
}else {
asyncCall();
}
// expected output: "resolved"
}
asyncCall();
既然你说你的脚本首先加载。你可以做什么它每隔 x
秒继续获取值,直到找到值。
例子
var fetchN3 = function () {
if (obj.n3 === undefined){
return setTimeout(function() {
fetchN3();
}, 500);
}
console.log("Found N3!!!", obj.n3);
}
我在 javascript 中有一个对象:
var a = {
n1: 1,
n2: 2
}
我想获取a.n3
的值,但是n3
稍后会添加到对象中。
如何在不使用任何循环并导致任何错误的情况下获取 n3
的值?
编辑
对象 a
是一种容器,来自不同范围的不同脚本正在异步添加变量(我正在使用 requireJS 来维护脚本)。
我的一个脚本 init.js
期望从对象中获取 属性 n3
,但是 属性 n3
被添加到对象中一个不同的脚本 swatchRenderer.js
,不幸的是,在 init.js
之后被称为 。因此 init.js
脚本没有得到值 n3
。
那么有什么方法可以阻止 init.js
中值的获取。
注意:我无法更改脚本的加载顺序。
如果对象 a
中不存在,a.n3
的值将是 undefined
。因此,您可以使用 if
条件来防止错误。
var a = {
n1: 1,
n2: 2
}
if(a.n3){
console.log('value found first');
}
a.n3 = 10;
if(a.n3){
console.log('value found second');
}
但是假设 n3
是一个 boolean
值,那么这个 if
条件将不起作用,所以最好的方法可能是检查类型 undefined
,
var a = {
n1: 1,
n2: 2
}
if(typeof a.n3 !== 'undefined'){
console.log('value found first');
}
a.n3 = false;
if(typeof a.n3 !== 'undefined'){
console.log('value found second');
}
var value = a.n3;
如果value没有定义,那么n3还没有定义,如果定义了,那么你得到的就是value。
如果你想 运行 一个函数在它被改变时给定 n3
的新值,一个选择是使用 getter/setter:
const a = {
n1: 1,
n2: 2,
get n3() {
return this._n3;
},
set n3(val) {
this._n3 = val;
console.log('saw change, new val: ' + val);
},
};
console.log('start');
a.n3 = 'foo';
console.log('end');
但这通常不是什么值得依赖的东西——当对象改变时触发外部的东西会更好。
更多 details/examples MDN
使用JavaScript的这个功能(这只是例子)
function resolveAfter2Seconds() {
return new Promise(resolve => {
setTimeout(() => {
resolve('resolved');
}, 2000);
});
}
var obj = {
n1: 2,
n2: 3
}
async function asyncCall() {
console.log('calling');
var result = await resolveAfter2Seconds();
console.log(result);
if (obj.n3) {
console.log("obj.n3 found");
//Here do your task
return;
}else {
asyncCall();
}
// expected output: "resolved"
}
asyncCall();
既然你说你的脚本首先加载。你可以做什么它每隔 x
秒继续获取值,直到找到值。
例子
var fetchN3 = function () {
if (obj.n3 === undefined){
return setTimeout(function() {
fetchN3();
}, 500);
}
console.log("Found N3!!!", obj.n3);
}