JavaScript - 这个这个

标签 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
}

“Hello, Nurse!”.foo.bar() 将记录“Hello, Nurse!”。

如果可以控制 foo,会有什么不同吗?

编辑:这里定义了 foo。

Edit2:很好,而不是this.this.thisthis.parent.parent。当然 parent 不存在,但希望现在语义不会妨碍。

Edit3:没有具体案例。提供的详细信息几乎是我得到的全部:有一个对象 foo,它是原型(prototype)的一部分。 foo.barfoo 的一个方法,应该访问它的祖 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"

或者如果我们将 foobar 重命名为更令人兴奋的名称:

"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/

相关文章:

java - 成员变量的多态性。我知道这是不可能的,我不明白这个具体案例

oop - 我们可以在 C# 中用带默认方法的接口(interface)替换抽象类吗

php - 用于检查 MySQL 的 JavaScript 时间戳

php - 我什么时候应该使用 'self' 而不是 '$this' ?

javascript - 注销 OnClientClick 不适用于 Sweetalert

javascript - React - 分段显示文本消息

perl - 这是 Moose Perl 的一个很好的替代品吗?

c++ - 使用父类构造函数为继承的变量重新赋值

javascript - 如何将数字四舍五入为完整分钟?

javascript - MongoDB Cursor.each 抛出错误