我为这么简单的问题道歉 - 我是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?
答案 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
是函数中的this
。 bind
(或self
变量)确保保留Journal
上下文中的this,无论函数调用的对象是什么。