是否可以制作一个可以在特定功能内操纵对象的功能?

时间:2019-10-20 03:12:07

标签: javascript object

让我们说我们有一个函数,其中包含一个对象以及更多内容:

 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()函数吗?

4 个答案:

答案 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();