别名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用于扩展实例。这类似于。该语法不起作用。只能在方法内部使用此
,而不仅仅是在分配原始文本时。