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

问题描述 投票:0回答:4

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

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

javascript object
4个回答
0
投票

这里的关键是

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);

0
投票

这个问题不是很清楚,但是据我了解,简短的答案是没有。

请阅读有关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,并从中取出对象。这将使您能够泛化许多对象的操作,在其中您可以自定义环境以定义可以对此对象执行的一组操作。这样,您可以封装突变并防止愚蠢的副作用


0
投票

如果您的“ 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。


0
投票

您还可以在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();
© www.soinside.com 2019 - 2024. All rights reserved.