1

假设你有

function Thing () {
  this.val = 1;
}

Thing.prototype.some = function () {
  console.log('thing');
};

Thing.prototype.foo = {
  bar: function () {
    console.log(root.val);
  }
};

您如何能够this在实例中获得对 as 的Thing引用,同时仍然坚持原型模型?

4

2 回答 2

4

使用该设置,唯一的方法是将对象(“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确定的规则非常简单。

于 2013-10-28T15:55:58.420 回答
0

您可以将函数绑定到上下文,而无需像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() );
于 2013-10-28T16:26:06.387 回答