为什么我不能使用组合构造函数/原型模式访问此实例变量?

时间:2014-01-22 06:08:43

标签: javascript

我为这么简单的问题道歉 - 我是JS的新手,虽然我认为我理解这种模式(组合构造函数/原型)。

在我的代码(下面的代码段)中,我的“Journal”类型的原型方法无法读取日记帐类型对象的实例属性。但我的其他类型工作正常,我看不出我的日记类型和我的其他类型之间的区别。

点击我的保存按钮(调用updateEntry方法,下面的代码)给出了这个错误:

Uncaught TypeError: Cannot read property 'length' of undefined 

这是相关的JavaScript -

var Journal = function(saveBtn) {
    this.entries = [];

    this.saveBtn = document.getElementById(saveBtn);
    this.saveBtn.onclick = this.updateEntry;
};

Journal.prototype.updateEntry = function() {
    console.log('Let\'s see if entries accessible: ' + this.entries.length);
};

var journal = new Journal('btn');

为什么期刊调用Journal.prototype.updateEntry()不能查看journal.entries?

1 个答案:

答案 0 :(得分:2)

使用DOM元素saveBtn作为this调用它,而不是Journal对象。

请改为:

this.saveBtn.onclick = this.updateEntry.bind(this);

或者如果使用IE8或更低版本,

var self = this;
this.saveBtn.onclick = function() { self.updateEntry(); };

说明:

点击发生时,会调用以下内容:

saveBtn.onclick();

因此saveBtn是函数中的thisbind(或self变量)确保保留Journal上下文中的this,无论函数调用的对象是什么。