String.prototype.foo = {};
String.prototype.foo.bar = function() {
//How can you reference the "grandparent" string?
console.log(this.parent.parent); //obviously, doesn't exist
}
如 “Hello, Nurse!”.foo.bar()
将记录“Hello, Nurse!”。
如果可以控制 foo,会有什么不同吗?
编辑:这里定义了 foo。
Edit2:很好,而不是this.this.this
,this.parent.parent
。当然 parent 不存在,但希望现在语义不会妨碍。
Edit3:没有具体案例。提供的详细信息几乎是我得到的全部:有一个对象 foo,它是原型(prototype)的一部分。 foo.bar
是 foo
的一个方法,应该访问它的祖 parent 。而已。没有其他的。这就是我所拥有的所有信息。
Edit4:已解决。根据提供的答案(以及来自 Douglas Crockford 的一些二手帮助):
String.prototype.foo = function() {
var that = this;
return {
bar : function() {
console.log(that.valueOf());
}
}
}
//Called:
"Hello, Nurse!".foo().bar();
最佳答案
可以做到这一点的唯一方法是将 foo()
变成一个函数。将其视为为特定字符串初始化 foo
命名空间:
String.prototype.foo = function () {
var str = String(this);
var o = Object(this)
o.bar = function () {
console.log(str);
};
return o;
};
然后你可以使用:
"foobar".foo().bar(); // logs "foobar"
或者如果我们将 foo
和 bar
重命名为更令人兴奋的名称:
"Hello!".console().log(); // logs "Hello!"
为什么这么复杂?
每个函数都使用一个特定的上下文 调用,该上下文 是单个对象。无论是使用 a.b()
还是使用 a.b.c.d()
调用都没有关系 - 它会立即在函数的left 处提供对象call 作为它的上下文。所以 a.b()
的上下文是 a
,而 a.b.c.d()
的上下文是 c
。关键字 this
引用上下文。因为 c
只是一个 object(不是一个正在运行的函数),它没有上下文,也没有 this
的概念,所以 this.this
没有意义。
因此,无法通用地访问所谓的“父”。胡安的回答给出了一个很好的概念性解释。但是,如果您想要实现的是原型(prototype)函数中的命名空间,那么您可以通过从 foo
返回一个扩充对象来实现。
请注意,我还必须将 this
转换为上面的 Object
。这是因为您不能将属性附加到原始值(如字符串)。 var str = "foo"; str.bar = 1
会起作用,但这只是因为 JS 自动将 "foo"
转换为对象。但是,由于 str
引用的是原始对象,而不是自动创建的对象,因此该对象会立即被丢弃,我们会丢失 bar
。
关于JavaScript - 这个这个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5751058/