我们有功能
function Buffer(initValue) {
this.append(initValue);
}
Buffer.prototype = {
items: [],
append: function(str) {
this.items[this.items.length] = str instanceof Buffer ? str.toString() : str;
return this;
},
toString: function() {
return this.items.join("");
}
};
console.log(new Buffer("one").append(new Buffer("two")).toString());
但突然间它会记录下来" onetwoonetwo" - 超出所有期望......为什么?
答案 0 :(得分:1)
几个答案解释为什么在您的特定实例中发生这种情况。
我怀疑你真正想要的是让items
对Buffer
的每个实例都是本地的,而不是通过原型共享。这只需在构造函数中声明items = [];
即可完成:
function Buffer(initValue) {
this.items = []; // This line replaces `items: [],` in the original code.
this.append(initValue);
}
Buffer.prototype = {
append: function(str) {
this.items[this.items.length] = str instanceof Buffer ? str.toString() : str;
return this;
},
toString: function() {
return this.items.join("");
}
};
答案 1 :(得分:0)
这是因为你多次申请追加。
由于您使用的是原型,因此您的item
数组由您的两个Buffer实例共享。
你应该这样:http://jsbin.com/luhoki/3/watch?html,css,js,output
function Buffer(initValue) {
this.append(initValue);
}
Buffer.prototype = {
items: [],
append: function(str) {
this.items[this.items.length] = str instanceof Buffer ? str.toString() : str;
return this;
},
toString: function() {
return this.items.join("");
}
};
a = new Buffer("one")
a.append("two")
console.log(a.toString());
// result: "onetwo"
答案 2 :(得分:0)
这就是你得到这种行为的原因。
遇到以下行时
console.log(new Buffer("one").append(new Buffer("two")).toString());
为方便起见,我们将它分解为较小的。
浏览器评估new Buffer("one")
。
然后浏览器评估new Buffer("two")
最后,上述两项结果的评估方式与result1.append(result2)
类似。
因此,当第一次获得评估时,Item数组将有一个。然后在第二个评估之后,项目数组将有两个元素“一”& “两个”,因为它是共享阵列。
将第一个结果视为result1,将第二个结果视为result2。现在当执行第三步时,它将连接result1的项数组,该数组有两个元素和result2的项数组,它与result1的相同,所以你在log中获得了四个元素onetwowoetwo。