JavaScript - 就是这个

Zir*_*rak 11 javascript oop

String.prototype.foo = {};
String.prototype.foo.bar = function() {
    //How can you reference the "grandparent" string?
    console.log(this.parent.parent); //obviously, doesn't exist
}
Run Code Online (Sandbox Code Playgroud)

如同,"Hello, Nurse!".foo.bar()将记录"你好,护士!".

如果对foo有控制权会有所作为吗?

编辑:在那里,定义了foo.

EDIT2:精细的,而不是this.this.this,this.parent.parent.当然父母不存在,但希望现在语义不会妨碍.

编辑3:没有具体案例.提供的细节几乎都是我得到的:有一个对象foo,原型的一部分.foo.bar是一种方法foo,并且应该访问其祖父母.而已.没有其他的.这就是我所拥有的所有信息.

编辑4:已解决.根据提供的答案(以及Douglas Crockford的一些二手帮助):

String.prototype.foo = function() {
    var that = this;
    return {
        bar : function() {
            console.log(that.valueOf());
        }
    }
}
//Called:
"Hello, Nurse!".foo().bar();
Run Code Online (Sandbox Code Playgroud)

Dav*_*ang 7

这可以做到的唯一方法就是foo()变成一个功能.可以将其视为初始化foo特定字符串的命名空间:

String.prototype.foo = function () {
    var str = String(this);
    var o = Object(this)
    o.bar = function () {
         console.log(str);
    };
    return o;
};
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

"foobar".foo().bar(); // logs "foobar"
Run Code Online (Sandbox Code Playgroud)

或者,如果我们重命名foobar进入更令人兴奋的事情:

"Hello!".console().log(); // logs "Hello!"
Run Code Online (Sandbox Code Playgroud)

为什么这么复杂?

使用作为单个对象的特定上下文调用每个函数.无论是调用a.b()还是a.b.c.d()无关紧要 - 它都会立即将函数调用左侧的对象作为其上下文.因此,上下文a.b()将是a,以及上下文a.b.c.d()c.关键字this引用上下文.因为c它只是一个对象(不是运行函数),它没有上下文,它没有概念this,所以this.this没有意义.

因此,不可能一般地访问所谓的"父母".胡安的回答给出了一个很好的概念解释原因.但是,如果您想要实现的是原型函数中的命名空间,那么您可以通过返回增强对象完成此操作foo.

注意我也必须转换thisObject上面的.这是因为您无法将属性附加到原始值(如字符串).var str = "foo"; str.bar = 1将工作,但只是因为JS自动转换"foo"为一个对象.但是,由于str引用了原语,而不是自动创建的对象,因此该对象立即被丢弃,我们就输了bar.