【问题标题】:Can I use an object as a template for other objects?我可以使用一个对象作为其他对象的模板吗?
【发布时间】:2019-02-02 08:36:51
【问题描述】:

我正在尝试减少我在 JS 对象中编写的重复代码的数量。我有一个我想使用的方法,除了目标之外几乎没有任何变化,我想将其提取出来并以某种方式通过对象属性名称获取目标。希望我放在一起的例子是有意义的。

myObject = {
  d: {
    get: function(list, id) {
      // do stuff
    },
    prop1: {
      data: [],
      list: myObject.config.lists.prop1.guid,
      get: function(a,b) {
        myObject.d.get(a,b)
      }
    },

    // I want to write this once and use the object key ("prop2") as an argument
    prop2: {
      data: [],
      list: myObject.config.lists.prop2.guid,
      get: function(a,b) {
        myObject.d.get(a,b)
      }
    }
  }
};

尝试了类似的方法,但出现错误“无法读取未定义的道具'spec':”

myObject = {
  d: {
    get: function(list, id) {
      // do stuff
    }
  },

  // Use this to duplicate shared funtions for similar
  spec: function(target) {
    return {
      data: [],
      list: myObject.config.lists[target].guid,

      get: function() {
        myObject.d.get(a, b);
      },
      update: "",
      delete: ""
    };
  },

  // some how return `myObject.spec.get()`, allowing me to use myObject.d.prop1.get()
  prop1: myObject.spec.apply(this, "prop1"),
  prop2: myObject.spec.apply(this, "prop2")
};

【问题讨论】:

  • 请将此简化为一个最小的完整示例。您引用了提供的示例中未定义的内容,这些内容本身缺少右大括号并且相当冗长。您还使用关键字 (get) 作为对象属性。虽然这在 JavaScript 中是合法的,但我会三思而后行。
  • @JaredSmith 清理了它,希望对您有所帮助
  • 如果您在对象上调用.get(),只需使用this.datathis.list...
  • 为什么不直接将target 属性名称作为参数显式传递给spec()
  • 同意@Bergi,虽然我认为整个想法似乎有点复杂,但这是最合乎逻辑的方式,对现有结构的改动最小。

标签: javascript object ecmascript-6


【解决方案1】:

到目前为止,我能够让它工作的唯一方法是在初始减速之外设置 prop1prop2,并像 @Bergi 建议的那样明确声明 target

var myObject = myObject || {};
myObject = {
  d: {
    get: function(list, id) {
      // do stuff
    }
  },

  // Use this to duplicate shared funtions for similar
  spec: function(target) {
    return {
      data: [],
      list: target,

      get: function() {
        myObject.d.get(a, b);
      },
      update: "",
      delete: ""
    };
  }

};

// some how return `myObject.spec.get()`, allowing me to use myObject.d.prop1.get()
myObject.prop1 = myObject.spec("prop1");
myObject.prop2 = myObject.spec("prop2");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多