假设我有一个 Posts
类。
我能做到:
Posts.prototype.foo = function () {
console.log(this);
}
当我调用 post1.foo()
(post1
是 Posts
类的一个实例)时,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
引用了函数所在的对象。这就是你的情况。范围比您希望的更早得到解决。
旁白:如果函数没有嵌套在对象中,并且您不使用 new
,this
将成为全局对象 (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/