【问题标题】:Aliasing javascript methods? [duplicate]别名javascript方法? [复制]
【发布时间】:2017-05-19 08:31:51
【问题描述】:

我有一个同时包含属性和方法的对象:

var foo = {
    bar: function(a) {},
    baz: 42
}

我正在尝试重组,将所有方法移动到一个新的methods 对象中:

var foo = {
    methods: {
        bar: function(a) {},
    }
    baz: 42
}

是否可以删除foo.bar() 同时保持向后兼容性?例如。当用户尝试foo.bar(a) 时,它的别名为foo.methods.bar(a)

【问题讨论】:

  • 只是一个建议,您可能想研究一下 OO JS 与这种方法的对比。
  • 如果您删除 foo.bar 则它不存在,因此“用户”将无法“尝试”foo.bar() - 只要没有“陷阱”,您就可以执行Object.keys(foo.methods).forEach(key => foo[key] = foo.methods[key]); 之类的操作" 在任何这些方法中使用this
  • 向后兼容性是关键。此代码在数百个站点上,删除 foo.bar() 会破坏任何期望它的第 3 方代码

标签: javascript proxy alias


【解决方案1】:

更新

var foo = { 
    methods: { 
        bar: function(a) { return true; } 
    }, 
    baz: 42,
    bar: function() { return this.methods.bar() } 
}

您需要保留参考,例如:

bar: this.methods.bar

【讨论】:

  • 该语法不起作用。您只能在方法中使用this,而不是仅在分配原始文字时使用。
【解决方案2】:

对象字面量通常用于存储状态(属性),而不是也具有行为(方法)的对象,除非我们谈论的是具有静态方法的对象。

一般来说,当使用方法创建对象时,你应该创建构造函数而不是对象字面量,然后你应该在该对象的原型上设置方法。

// Use constructor functions for instantiatable objects
function foo () {
  // Local variables and instance properties are defined in the constructor
  
  // Set up a simple proxy reference:
  this.bar = this.methods.bar;
  this.baz = 42;
}

// Set up methods on the prototype, not the constructor because the 
// algorithms stored in these properties won't change from instance
// to instance, so we should just store them once - on the prototype
// that all instances of foo will inherit. 
foo.prototype.methods = {
  bar : function (a) {
    console.log("Hello from foo.methods.bar!");
  }
};

// Instantiate a "foo"
var f = new foo();

// Call the proxy
f.bar();

【讨论】:

  • 很难理解为什么 methods 应该放在 Foo.prototype 而不是直接放在 Foo 上。
  • 由于方法(行为)不会因实例而异,因此建议将它们放在原型上以减小对象的大小。每个实例都没有理由存储相同的功能。但是,存储实例数据的属性并非如此,每个实例可能需要为属性存储不同的值,因此这些属性直接写入构造函数。
  • 感谢您的回答,但这并没有解决如何在移动方法时保持向后兼容性的主要问题。看起来 ES6 代理就是答案。
  • 我想我的意思是原型只是被用作挂起方法的钩子。 this.methods.barfoo.methods.bar 之间没有功能上的区别,除了第二个它明确表示它是用于扩展实例的 foo.methods 。这类似于OLOO pattern
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 2012-01-03
相关资源
最近更新 更多