是否可以将对象原型上的方法组织到命名空间中?

时间:2014-03-01 00:46:39

标签: javascript prototype

我正在尝试在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(),我没试过,但听起来更有可能工作。

3 个答案:

答案 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"

有几点需要注意:

答案 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个对象可以存在于许多“父母”中,因此如何确定哪个是您想要的对象