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)
这可以做到的唯一方法就是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)
或者,如果我们重命名foo并bar进入更令人兴奋的事情:
"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.
注意我也必须转换this成Object上面的.这是因为您无法将属性附加到原始值(如字符串).var str = "foo"; str.bar = 1将工作,但只是因为JS自动转换"foo"为一个对象.但是,由于str引用了原语,而不是自动创建的对象,因此该对象立即被丢弃,我们就输了bar.