为了账号安全,请及时绑定邮箱和手机立即绑定

原型:用于访问实例范围的“ this”的深范围

原型:用于访问实例范围的“ this”的深范围

红颜莎娜 2019-12-06 12:34:41
如何缓存最高范围,以便以后在原型中更深入地使用,如下所示:var Game = function(id){   this.id = id;};Game.prototype = {  board : {    init: function(){       // obviously "this" isn't the instance itself, but will be "board"       console.log(this.id);    }  }}var game = new Game('123');game.board.init(); // should output "123"更新:好了,现在我考虑一下,我可以使用apply/ call并传递上下文...game.board.init.apply(game);
查看完整描述

3 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

这样做是一个非常糟糕的主意,因为在某些情况下它会导致非常奇怪的行为,但是有可能:


var Model = function(x) { this.x = x };


Object.defineProperty(Model.prototype, 'a', (function() {

  var lastSelf;

  function get() { return lastSelf.x }

  get.on = function () { return lastSelf.x * 2 };

  return { get() { lastSelf=this; return get } };

})());


var m = new Model(17);

console.log(m.a(), m.a.on());

为什么?我在下面看到您的答案,试图了解哪些是不好的情况。


您不能传递a变量。获取相同对象的属性后,

必须on立即授予对以下内容的访问权限a:


var m1 = new Model(1), m2 = new Model(3);

console.log(m1.a(), m2.a(), m1.a.on(), m2.a.on()); // 1 3 2 6 - ok

var a1 = m1.a, a2 = m2.a;

console.log(m1.a(), m2.a(), a1.on(), a2.on()); // 1 3 6 6 - ooops!

console.log(m1.a(), m2.a(), m1.a(), a1.on(), a2.on()); // 1 3 1 2 2 - ooops!


查看完整回答
反对 回复 2019-12-06
  • 3 回答
  • 0 关注
  • 449 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信