我正在尝试在JavaScript中实现特定的语法模式。本质上,要求是使用新方法扩展本机JavaScript对象的原型,并将这些方法组织到命名空间中。我正在寻找的结果可以概括为:
String.prototype.foo = {
bar: function() { return this.toUpperCase(); } //Fails because "this" is foo, not it's parent string
};
'test'.foo.bar(); //should return 'TEST'
我知道还有其他方法可以达到类似的结果,但我真的更喜欢上面的语法是可能的 - 尽管我大约80%确定它不是。
我已经尝试了十几种不同的方法来构建它,但是我无法找到任何方法将字符串作为“this”在bar()中。我认为问题是因为 foo 是一个对象并且没有可执行代码,所以编译器无法将所有者“this”传递给它并从那里传递给子方法,但是我想知道是否存在一些我不知道的用于行走父链的模糊技术?接下来最好的事情可能是'test'.foo()。bar(),我没试过,但听起来更有可能工作。
答案 0 :(得分:4)
当然,你走了:
Object.defineProperty(String.prototype,"foo", {
get: function(){
return {
bar: function(){ return this.toUpperCase() }.bind(this)
}
},
enumerable: false, // don't show in for.. in loop
configuratble: true,
});
"hello".foo.bar(); // "HELLO"
有几点需要注意:
defineProperty
用于定义getter Function::bind
用于修复this
值。答案 1 :(得分:0)
虽然这个答案会使你的"命名空间"一个函数而不是一个对象,这应该工作:
String.prototype.foo = function(){
var self = this;
return {
bar: function() { return self.toUpperCase(); }
};
}
'test'.foo().bar()
答案 2 :(得分:0)
嗨,这是功能
的解决方案String.prototype.foo = function(){
var that = this;
return{
bar:function(){
return that.toUpperCase()
}
}
}
'test'.foo().bar();
我认为对象的解决方案不存在。请注意,1个对象可以存在于许多“父母”中,因此如何确定哪个是您想要的对象