别名javascript方法?

别名javascript方法?,javascript,proxy,alias,Javascript,Proxy,Alias,我有一个包含属性和方法的对象: 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)?已更

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

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)

已更新

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

您需要保留一份参考资料,例如:


bar:this.methods.bar

对象文本通常用于存储状态(属性),而不是具有行为(方法)的对象,除非我们讨论的是具有静态方法的对象

通常,在使用方法生成对象时,应该生成构造函数而不是对象文本,然后应该在该对象的原型上设置方法

//对可实例化对象使用构造函数
函数foo(){
//局部变量和实例属性在构造函数中定义
//设置一个简单的代理引用:
this.bar=this.methods.bar;
这是1.baz=42;
}
//在原型而不是构造函数上设置方法,因为
//存储在这些属性中的算法不会从实例更改
//例如,我们应该只在原型上存储一次
//所有foo实例都将继承。
foo.prototype.methods={
酒吧:功能(a){
log(“来自foo.methods.bar的你好!”);
}
};
//实例化一个“foo”
var f=新的foo();
//打电话给代理

f、 bar()只是一个建议,你可能想研究OO JS与这种方法的对比。如果你删除了foo.bar,那么它就不存在了,所以“用户”将无法“尝试”
foo.bar()
-你可以做一些类似于
Object.keys(foo.methods).forEach(key=>foo[key]=foo.methods[key])
只要在这些方法中使用
这个
没有“陷阱”,那么向后兼容性就是关键。此代码存在于数百个站点上,删除
foo.bar()
会破坏任何第三方代码,这些代码期望很难理解为什么方法应该在foo.prototype上,而不是直接在foo.prototype上。由于方法(行为)不会因实例而异,建议将它们放在原型上以减小对象的大小。没有理由每个实例都存储相同的函数。但是,对于存储实例数据的属性,情况并非如此,每个实例可能需要为属性存储不同的值,因此这些属性将直接写入构造函数。感谢您的回答,但这并没有解决在移动方法时如何保持向后兼容性的主要问题。看起来ES6代理就是答案。我想我的观点是原型只是用来挂断方法的钩子。在
this.methods.bar
foo.methods.bar
之间没有功能上的区别,除了第二种方法之外,显然是foo.methods用于扩展实例。这类似于。该语法不起作用。只能在方法内部使用
,而不仅仅是在分配原始文本时。