我正在尝试在 JavaScript 中实现特定的语法模式。本质上,要求是用新方法扩展原生 JavaScript 对象的原型(prototype),并将这些方法组织到命名空间中。我正在寻找的结果可以概括为:
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% 的把握认为它不是。
我已经尝试了十几种不同的构造方法,但我找不到任何方法在 bar() 中将字符串作为“this”。我认为问题是因为 foo 是一个对象并且没有可执行代码,所以编译器无法将所有者“this”传递给它并从那里向下传递给子方法,但是我想知道是否存在一些我不知道的遍历父链的晦涩技术?下一个最好的方法可能是 'test'.foo().bar(),我还没有尝试过,但听起来更有可能起作用。
最佳答案
当然,给你:
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
用于定义 setter/getter -
Function::bind
用于修复this
值。
关于javascript - 是否可以将对象原型(prototype)上的方法组织到 namespace 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22108563/