假设你有
function Thing () {
this.val = 1;
}
Thing.prototype.some = function () {
console.log('thing');
};
Thing.prototype.foo = {
bar: function () {
console.log(root.val);
}
};
您如何能够this
在实例中获得对 as 的Thing
引用,同时仍然坚持原型模型?
假设你有
function Thing () {
this.val = 1;
}
Thing.prototype.some = function () {
console.log('thing');
};
Thing.prototype.foo = {
bar: function () {
console.log(root.val);
}
};
您如何能够this
在实例中获得对 as 的Thing
引用,同时仍然坚持原型模型?
使用该设置,唯一的方法是将对象(“Thing”实例)作为参数显式传递,或使用.call()
or .apply()
。
如果你实例化一个“事物”:
var thing = new Thing();
然后您可以使用thing.foo.bar
. 从该参考中调用:
thing.foo.bar();
this
“bar”内部的值将是原型上的“foo”对象。但是,您可以使用.call()
:
thing.foo.bar.call(thing);
那么this
在“bar”的调用中确实将是实例化的“Thing”对象。
重要的是要记住,在 JavaScript 中,将对象属性设置为函数不会在对象和函数之间创建任何类型的特殊关系。重要的是在引用表达式中的属性值时发现的关系。它总是动态的,虽然遵循原型链的机制有些令人眼花缭乱,但如何this
确定的规则非常简单。
您可以将函数绑定到上下文,而无需像call
/apply
那样执行它。使用bind
.
例如:
function Thing () {
this.val = 1;
}
Thing.prototype.some = function () {
console.log('thing');
};
Thing.prototype.foo = {
bar: function () {
console.log(this.val);
}
}
var thing = new Thing();
// bind instance's `foo.bar` to `thing` instance
thing.foo.bar = thing.foo.bar.bind( thing );
// now you can call it without providing `thing` as the context every time like wit apply/call
console.log( thing.foo.bar() );
事件可以绑定foo.bar
到 Thing 的实例,但随后 Thing 的每个实例都foo.bar
绑定到 Thing 的共享实例。我不确定这是否是个好主意,但它确实有效:
function Thing () {
this.val = 1;
}
Thing.prototype.some = function () {
console.log('thing');
};
Thing.prototype.foo = {
bar: function () {
console.log(this.val);
}.bind( new Thing() )
}
var thing = new Thing();
console.log( thing.foo.bar() );