从子对象函数访问原型

时间:2013-10-28 15:52:55

标签: javascript prototype

假设你有

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

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

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

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

2 个答案:

答案 0 :(得分:4)

使用该设置,唯一的方法是明确地将对象(“Thing”实例)作为参数传递,或使用.call().apply()

如果您实例化“Thing”:

var thing = new Thing();

然后你可以将{bar'函数作为thing.foo.bar。从该引用调用:

thing.foo.bar();

“bar”中this的值将是原型上的“foo”对象。但是,您可以使用.call()

thing.foo.bar.call(thing);

然后调用“bar”中的this确实是实例化的“Thing”对象。

重要的是要记住,在JavaScript中,将对象属性设置为函数不会在对象和函数之间创建任何类型的特殊关系。重要的是引用到表达式中的属性值时发现的关系。它始终是动态的,虽然遵循原型链的机制有点令人眼花缭乱,但确定this的方法的规则非常简单。

答案 1 :(得分: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() );