javascript对象方法定义区别

标签 javascript object syntax constructor difference

我正在尝试寻找学习 Javascript 的方法,但遇到了一个问题,即我被告知的几段代码是相同的,但结果却不同。我发现定义对象(实例)有三种方法:

版本 1:

var obj = { //create the instance
  variable: value
};
obj.fun = function() {
  obj.variable += 1;
  console.log('obj.fun is called');
};

版本 2:

var obj = { //create the instance
  variable: value,
  fun: function() {
    this.variable += 1;
    console.log('obj.fun is called');
  }
};

版本 3:

function Obj() { //create the class
  this.variable = value;
  this.fun = function() {
    this.variable += 1;
    console.log('obj.fun is called');
  }
};
obj = new Obj(); //create the instance

事实上,我想做的是使用以下方法在 HTML5 Canvas 中创建鼠标事件处理程序:

canvas_id.addEventListener("mousedown", obj.fun, false);

目前,如果我尝试使用此事件监听器调用函数 obj.fun,则只有版本 1 有效,但我更喜欢使用版本 2,因为我认为它更干净。在版本 2 和 3 中,调用 obj.fun(newvalue) 时会执行该函数(创建控制台消息),但变量不会更改为新值;如果我尝试检索 obj.variable ,则会返回原始值。

我想知道这三个版本的书写方式到底有什么区别,这样我就能明白什么时候用什么。提前致谢。

最佳答案

第一个版本中拥有的是一个命名变量obj,用于保存所需的对象。在另外两个中,this(调用的上下文)不是您的对象(事件处理回调的常见问题)。

您仍然可以通过将绑定(bind)更改为来使用这些版本

canvas_id.addEventListener("mousedown", obj.fun.bind(obj), false);

或(兼容IE8)

canvas_id.addEventListener("mousedown", function(){ obj.fun() }, false);

关于javascript对象方法定义区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19710438/

相关文章:

javascript - 为什么我的 addClass 方法不起作用?

java - 仅第一个对象在 JFrame 上可见

lambda - lambda 表达式中逗号的 F# 语法

c - 如果范围是一个不同的struct定义,那么struct声明是否存在于声明范围之后?

javascript - 我不明白 JSONP 与 AJAX 有何不同

javascript - CodeIgniter:根据屏幕宽度加载不同的 View 而不是创建移动版本?

javascript - 如何检查 JSON 中的 Json Norm 值

java - 如果调用另一个方法则调用一个方法

javascript - js中动态多对象属性名称的问题

c++ - 为什么有些人更喜欢 "T const&"而不是 "const T&"?