我正在编写与音乐相关的程序,并希望将对象作为对象中的属性。我知道可以一个接一个地做,但我想要一个捷径。这就是我想要做的事情,我知道这不起作用。什么是正确的方法?有可能吗?
function OctaveNote(note, value) {
this.firstOctave = note + 1.value = value;
this.secondOctave = note + 2.value = value + 12;
this.thirdOctave = note + 3.value = value + 24;
}
或
function OctaveNote(note, value) {
this.firstOctave = note + 1;
this.firstOctave.value = value;
this.secondOctave = note + 2;
this.secondOctave.value = value + 12;
this.thirdOctave = note + 3;
this.thirdOctave.value = value + 24;
}
因此C = new OctaveNote ("C", 0);
让我知道C3.value = 24
并且我不必为所有11个音符,99行的每个八度音阶写单个对象!
答案 0 :(得分:0)
是的,但它必须是对象而不是字符串。
这会创建一个字符串:this.firstOctave = note + 1;
但您无法将字符value
添加到字符串中。
所以你需要做的是创建一个像这样的对象:
// Constructor
function OctaveNote(note, value) {
// If we have a note and a value, we add a note.
if (typeof note !== 'undefined' && typeof value !== 'undefined') this.addNote(note, value);
}
OctaveNote.prototype.addNote = function(note, value) {
this[note+1] = value;
this[note+2] = value + 12;
this[note+3] = value + 24;
}
var octave = new OctaveNote("B", 14);
octave.addNote('C', 2);
octave.addNote('A', 6);
console.log(octave.C1); // 2
console.log(octave.A2); // 18
console.log(octave.C3); // 26
答案 1 :(得分:0)
你的第二个例子应该是涵盖你需要的例子。您的错误是使用/如何调用它。
使用
创建C
对象时
C = new OctaveNote("C", 0)
您现在拥有一个OctaveNote
实例,可以使用构造函数中设置的所有属性进行访问。
所以你可以通过调用
来获得thirdOctave C.thirdOctave.value
应返回24
。
你的问题是thirdOctave
本身不是一个对象,所以它不能保存属性,比如值。您可以将thirdOctave转换为包含字符串和值对的对象,也可以将值存储在其自己的单独属性中:thirdOctaveValue
。
所以你可以将函数转换成类似的东西:
function OctaveNote(note, value) {
this.firstOctaveName = note + 1;
this.firstOctaveValue = value;
this.secondOctaveName = note + 2;
this.secondOctaveValue = value + 12;
this.thirdOctaveName = note + 3;
this.thirdOctaveValue = value + 24;
}
然后,您可以为每个音符启动对象:
D = new OctaveNote("D", 20);
X = new OctaveNote("X", 32);
从中获取价值:
console.log(D.firstOctaveValue);
console.log(X.secondOctaveValue);
等