Javascript最简单的使用原型与`self = this`和回调

时间:2017-03-28 02:41:55

标签: javascript class prototype

我已经阅读了一些问题,例如this,但我仍然无法使其发挥作用:

这是我的简化测试:

1.eth0
2.nflog (Linux netfilter log (NFLOG) interface)
3.nfqueue (Linux netfilter queue (NFQUEUE) interface)
4.eth1
5.usbmon1 (USB bus number 1)
6.eth2
7.usbmon2 (USB bus number 2)
8.any (Pseudo-device that captures on all interfaces)
9.lo

可以在此处测试:http://codepen.io/anon/pen/bqxmPa?editors=0010

1。为什么var person = function(name, job) { var self = this; self.name = null; self.callMe = function() { alert(self.name + ' please!'); }; self.init = function() { self.name = name; setTimeout(function(){self.callMe()}, 1000); }(); } ... person.prototype.callMe = function() { alert('Mister ' + this.name + ' please!'); }; var jonh = new person('john'); var joe = new person('joe'); 函数使用原始函数?

我已经读过我必须使用callMe()才能使用原型,这使得sens:因为我从this调用存储在var self中的函数存储在我以后的原型不会修改var ...但是如果我不将self.init()存储在this中,我该如何进行回调?

2。如果我覆盖self之类的callMe它会做同样的事情,那我为什么要使用原型?

我也理解在原型中放置一个方法对性能有好处,因为它在每个实例中都没有重复,但仍然在它们之间共享。

感谢您的教学!

1 个答案:

答案 0 :(得分:1)

1。)这就是原型继承的工作原理。当callMe的回调返回时,代码尝试在回调的执行上下文中解析变量self。由于它没有在那里定义,它上升到原型链并在执行上下文中定义它,在定义callMe和init函数的同一级别上。由于callMe是在这个级别定义的,它只会执行它。如果它没有在这个级别定义,它将执行原型上定义的函数。

2)如果你想订阅OO JS,那么把这些函数放在原型上就可以清楚地表明它们是uhh'接口方法'。你在这里做的是每次你新的'有效地定义实例方法。上课。

这里是我如何将Person类实现为OO

var Person = function(name, job){
  this.name = name;
  this.init();
};

Person.prototype.init = function(){
  setTimeout((function() {
      this.callMe();
    }).apply(this), 1000);
};

Person.prototype.callMe = function(){
  alert('Mister ' + this.name + ' please!');
};

var jonh = new Person('john');
var joe = new Person('joe');