【问题标题】:Is it possible to make a function that can manipulate the object inside a particular function?是否可以制作一个可以在特定函数内操作对象的函数?
【发布时间】:2019-10-20 03:12:07
【问题描述】:

假设我们有一个函数,里面有一个对象等等:

 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


【解决方案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】:

    这个问题不是很清楚,但据我了解,简短的回答是否定的。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        您还可以在 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();

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-05
          相关资源
          最近更新 更多