我正在努力理解如何引用变量并在Javascript中保持活力。在下面我有两种类型的对象,一个Note和一个IntervalBuilder,它接受一个Note并创建 第二个注意事项。
function Note() {
this.key = 1 + Math.floor( Math.random() * 13); // from 1 to 13 inclusive
this.setKey = function setKey(i) { key = i; };
this.getKey = function getKey() { return this.key; } ; // {return key} is a ReferenceError!!
}
function IntervalBuilder() {
this.setPerfectFifth = function setPerfectFifth(root) {
this.fifth = new Note();
console.log("this.fifth: " + this.fifth);
this.y = root.key;
console.log("root.key: " + root.key );
console.log("y: " + this.y );
this.fifth.setKey( this.y + 4 );
return this.fifth;
};
}
有了上述内容,我现在可以这样做:
var x = new Note();
var ib = new IntervalBuilder();
ib.setPerfectFifth(x);
然而,实例ib现在有一个名为5th的成员!我希望的是我可以将setPerfectFifth的返回值(注释)分配给变量,让第五个消失。怎么做的?
非常感谢任何帮助,我发现很多这些令人困惑。
杰拉德
答案 0 :(得分:1)
由于您在javascript 中命名了您的问题变量可见性,基本上是:在this.fifth = new Note();
中,关键字this
引用该实例({{1}的ib })。因此,您将新创建的注释附加到实例。在JavaScript中,只要可以从全局对象(var ib = new ...
开始,当您想到图形时)到达变量时,它就不会被垃圾收集掉。
你想要的是:window
,它将创建一个局部变量,一旦函数执行结束,它将被释放。显然,var fith = new Note()
的每次使用都必须由this.fifth
替换。
答案 1 :(得分:1)
我不知道你想要实现什么,但我认为你需要以下代码结构:
// ==============================
// NOTE "CLASS"
// ==============================
var Note = (function () {
// Constructor
function Note() {
this._key = 1 + Math.floor( Math.random() * 13);
}
// Getter
Note.prototype.getKey = function () {
return this._key;
};
// Setter
Note.prototype.setKey = function (i) {
this._key = i;
};
return Note;
})();
// ==============================
// INTERVAL BUILDER "CLASS"
// ==============================
var IntervalBuilder = (function () {
// Constructor
function IntervalBuilder() {}
// Private members
var fifth = null,
y = 0;
// Setter
IntervalBuilder.prototype.setPerfectFifth = function (root) {
fifth = new Note();
y = root.getKey();
fifth.setKey(y + 4);
return fifth;
};
return IntervalBuilder;
})();
// ==============================
// CLIENT CODE
// ==============================
var x = new Note(),
ib = new IntervalBuilder();
ib.setPerfectFifth(x);