javascript - 访问原型(prototype)父级

标签 javascript class inheritance prototype this

假设我有一个 Posts 类。

我能做到:

Posts.prototype.foo = function () {
  console.log(this);
}

当我调用 post1.foo()(post1Posts 类的一个实例)时,this控制台输出的 将等于 post1

现在考虑以下场景:

Posts.prototype.baz = {
  foo: function () {
   console.log(this);
  },
  bar: [1,2,3,4]
}

现在当我执行 post1.baz.foo() 时,this 的值不再是 post1,而是 {foo: ..., bar: ...}.

我的问题是:在第二种情况下,如何从 foo 中访问 post1

最佳答案

您遇到了一个有趣的问题。您正在做的不是 Javascript 中的常见模式(将嵌套对象分配给原型(prototype)),从表面上看它应该可以工作。

Javascript this 有两种解决方法。如果您正在使用 new 实例化函数,this 将成为对该实例化对象的引用(如您所知)。

但是,this 也可以解析为父对象。也就是说,此代码将记录 'bar':

var obj = {
    prop: 'bar',
    log: function() { console.log( this.prop ); }
};
obj.log();

因为 this 引用了函数所在的对象。这就是你的情况。范围比您希望的更早得到解决。

旁白:如果函数没有嵌套在对象中,并且您不使用 newthis 将成为全局对象 (window 在浏览器中)。

执行此操作的正确方法可能是在 Posts 的构造函数中,您可以在其中设置 this.whatever 并将其绑定(bind)到实例。此方法最常用于“私有(private)”变量,但在您需要将计算数据添加到您的类中或在您的情况下声明特定范围时也很有用。

function Posts() {
    var self = this;

    this.baz = {
        foo: function () {
            console.log(self);
        },
        bar: [1,2,3,4]
    }
}

你也可以这样做:

    ...
    this.baz = {
        foo: function () {
            console.log(this);
        }.bind(this),

您可能想仔细看看为什么需要在类原型(prototype)上嵌套对象。你能把它分解成所有平面原型(prototype)方法吗?它是不需要在每个类实例上实例化的数据,可以从其他地方提取出来吗?

关于javascript - 访问原型(prototype)父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32410705/

相关文章:

javascript - 如何使用动态 html 和注入(inject) Angular 引导弹出窗口的指令?

c++ - 为什么 'class'和 'main'中的相等表达式表现不同?

java - 对Java继承规则的困惑

c++ - 额外的继承对对象结构或实例化有什么影响吗?

Python将类属性导入方法局部命名空间

c# - 继承:访问父成员

javascript - Angular 2 http post 作为空对象或在关键端发送

javascript - 如何: Give permissions for text channel when user joins VC and revoke when user leaves VC

javascript - 自定义小部件中的 dojo 数据网格未呈现

php - 在多个 Apache 服务器上使用 session 数据库