让我们说我们有一个函数,其中包含一个对象以及更多内容:
function myFunc() {
var obj = {
"one" : "1",
"two" : "2"
};
// And more code is down here but our main focus is in the obj object.
};
现在考虑为myFunc()设计的另一个函数,该函数可以在myFunc()的对象obj中添加或删除属性。例如,通过考虑函数manip()是可以将myFunc()函数内部的obj对象最小化的特殊函数:
manip("add", {
"three" : "3"
};
/* Now the obj object inside myFunc() becomes :
var obj = {
"one" : "1",
"two" : "2",
"three" : "3"
}
再次:
manip("remove", "one three");
/* Now the obj object inside myFunc() becomes :
var obj = {
"two" : "2"
}
那么,这有可能吗?可以制作manip()函数吗?
答案 0 :(得分:1)
这个问题不是很清楚,但是据我了解,简短的回答是没有。
请阅读有关scope in JS
该对象位于myFunc()的范围内,因此无法从该函数以外的任何位置对其进行访问。
有3种方法可以解决此问题。
1)全局定义对象
这很明显,将对象移到函数之外
2)将指向该对象的指针传递给manip()
因此,在这种情况下,manip将采用第三个参数
manip(command, value, object)
并对给定的对象执行给定的动作
3)传入函数(或调用它)
对此我不太有把握,因为问题很不清楚这样做的目的是什么,但是您可以传入将对象返回到manip()的函数
manip(command: String, value: String, f: (..) => Object)
myFunc(){
...
return obj
}
manip将其称为f,并从中取出对象。这将使您能够泛化许多对象的操作,在其中您可以自定义环境以定义可以对此对象执行的一组操作。这样,您可以封装突变并防止出现愚蠢的副作用
答案 1 :(得分:1)
这里的关键是
1)将obj
公开为函数的公共财产
2)实例化一个myFunc
对象
3)将该对象传递给您的manip
函数,以便可以对其进行修改
function myFunc() {
this.obj = {
one: '1',
two: '2'
};
};
function manip(item, action, parameters) {
if (action === 'add') {
return item.obj = { ...item.obj, ...parameters };
} else if (action === 'remove') {
delete item.obj[parameters];
}
}
// Instantiate a new myFunc Object
const myFuncInstance = new myFunc();
console.log(myFuncInstance.obj);
manip(
myFuncInstance,
'add',
{ three: '3' }
);
console.log(myFuncInstance.obj);
manip(
myFuncInstance,
'remove',
'two'
);
console.log(myFuncInstance.obj);
答案 2 :(得分:1)
如果您的“ manip”功能在myFunc的范围内,则它可以“查看”您的对象。
function myFunc() {
var obj = {
"one" : "1",
"two" : "2"
};
function manip(prop,value) {
obj[prop] = value;
}
manip("three","3");
console.log(obj);
}
myFunc();
// { one: '1', two: '2', three: '3' }
如果您的manip函数不在myFunc的范围内,它将看不到您用“ var”声明的内容-obj的范围仅限于myFunc。
答案 3 :(得分:1)
您还可以在myFunc中定义您的manip函数来执行操作。
function myFunc() {
var obj = {
"one" : "1",
"two" : "2"
};
function manip(type, ...options) {
switch(type) {
case 'add':
// perform some validation before assign
Object.assign(obj, ...options)
console.log({type, obj});
break;
case 'remove':
// perform some validation before assign
delete obj[options[0]]
console.log({type, obj});
break;
default:
console.log('No default actions...');
}
}
manip('add', { "three" : "3" });
manip('remove', 'two');
};
myFunc();