String.prototype.foo = {};
String.prototype.foo.bar = function() {
//How can you reference the "grandparent" string?
console.log(this.parent.parent); //obviously, doesn't exist
}
As in, "Hello, Nurse!".foo.bar()
会记录“你好,护士!”。
如果可以控制 foo 会有什么不同吗?
编辑:在那里,定义了 foo 。
编辑2:很好,而不是this.this.this
, this.parent.parent
。当然,parent 不存在,但希望现在语义不会妨碍。
Edit3:没有具体案例。提供的细节几乎是我得到的全部:有一个对象 foo,原型的一部分。foo.bar
是一种方法foo
,并且应该访问它的祖父母。就是这样。没有其他的。这就是我所掌握的全部信息。
编辑4:已解决。根据提供的答案(以及道格拉斯·克罗克福德的一些二手帮助):
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
and bar
进入更令人兴奋的事情:
"Hello!".console().log(); // logs "Hello!"
为什么这么复杂?
每个函数都通过特定的调用context那是一个单一的对象。是否调用a.b()
or a.b.c.d()
没关系 - 它会立即将对象提供给left函数调用的上下文作为其上下文。所以上下文a.b()
将会a
,以及上下文a.b.c.d()
is c
。关键词this
引用上下文。因为c
只是一个object(不是正在运行的函数)它没有上下文,也没有概念this
, so this.this
没有意义。
因此,不可能通用地访问所谓的“父级”。胡安的回答给出了一个很好的概念性解释。但是,如果您想要实现的是原型函数中的命名空间,那么您can通过返回一个增强对象来做到这一点foo
.
请注意,我还必须转换this
进入一个Object
多于。这是因为您无法将属性附加到原始值(如字符串)。var str = "foo"; str.bar = 1
会起作用,但只是因为 JS 自动转换"foo"
成一个物体。然而,自从str
引用原语,而不是自动创建的对象,然后该对象立即被丢弃,我们就输了bar
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)