没有这个的JavaScript类,那个,自我等

时间:2017-04-13 11:06:34

标签: javascript

是否可以在不使用'this'关键字的情况下创建JavaScript类?表达式如

var self = this;
...
self.property = value;

也是禁止的。我不想考虑上下文而只使用变量。

看看这个简单的课程:

function Timer() {
  var interval = 0;
  var count = ++Timer.totalCount;

  function setInterval(val) {
    interval = val;
  }
  function run() {
    setTimeout(done, interval);
  }
  function done() {
    var div = document.createElement('div');
    div.innerHTML = 'Timer #' + count + ' finished in ' + interval + ' ms';
    document.body.appendChild(div);
  }

  return {
    setInterval: setInterval,
    run: run
  }
}
Timer.totalCount = 0;

var t1 = new Timer();
var t2 = new Timer();
var t3 = new Timer();

//how to directly set interval value without set function?
t1.setInterval(3000);
t2.setInterval(2000);
t3.setInterval(1000);

t1.run();
t2.run();
t3.run();

这个类根本不使用'this'。

这是对的吗?

我可以创建这样的真实课程吗?有潜在的问题吗?

如何在没有get / set函数的情况下在此类中创建属性?

该类是否可以使用继承进行扩展?

1 个答案:

答案 0 :(得分:1)

首先,this是JavaScript中的基本内容。我们非常建议您了解它并了解其背景。

如果你想要一个更传统的" OOP代码并且能够使用ES6 / ES2015(或使用Babel进行转换),所有关于this的推理也变得更容易,所有代码都更加干净。这是您使用ES2015重写的示例,包括继承部分:



class Timer {
  constructor(count, interval) {
    this.interval = interval
    this.count = count
  }

  run() {
    setTimeout(() => {
      const div = document.createElement('div')
      div.innerHTML = `Timer #${this.count}
        finished in ${this.interval} ms`
      document.body.appendChild(div)
    }, this.interval)
  }
}

class OneSecondTimer extends Timer {
  constructor(count) {
    super(count, 1000)
  }
}

const t1 = new Timer(1, 3000)
const t2 = new Timer(2, 2000)
const t3 = new OneSecondTimer(3)

t1.run()
t2.run()
t3.run()