在 JavaScript 中,对象属性可以通过两种方式定义:直接在对象上定义或作为对象的属性对象的原型。在处理数组时,此行为具有重大影响。
默认情况下,原型数组在类的所有实例之间共享,从而导致意外行为。例如,如果一个类的原型包含一个空数组,则所有实例都将引用同一个数组。这可以在以下示例中观察到:
function Sandwich() { // Uncomment to fix the problem //this.ingredients = []; } Sandwich.prototype = { "ingredients": [], "addIngredients": function(ingArray) { for(var key in ingArray) { this.addIngredient(ingArray[key]); } }, "addIngredient": function(thing) { this.ingredients.push(thing); } }; var cheeseburger = new Sandwich(); cheeseburger.addIngredients(["burger", "cheese"]); var blt = new Sandwich(); blt.addIngredients(["bacon", "lettuce", "tomato"]); print_r("Cheeseburger contains:", cheeseburger.ingredients);
在此示例中,cheeseburger 和 blt 共享相同的成分数组,即使它们是不同的实例。向芝士汉堡添加成分也会影响 blt,突出数组的共享性质。
要纠正此行为,建议直接在对象本身上定义数组,而不是作为原型属性。这确保每个实例都有自己的私有数组。对代码进行以下修改可以解决问题:
function Sandwich() { this.ingredients = []; }
通过在构造函数中定义数组,Sandwich 的每个实例都将拥有自己的数组私有副本,从而消除共享行为。
总之,原型数组在 JavaScript 中类的所有实例之间共享。要为每个实例创建私有数组,需要在构造函数中直接在对象本身上定义数组。这种区别对于理解和管理 JavaScript 中的对象行为至关重要。
以上是JavaScript 对象成员的原型是共享数组还是私有数组?的详细内容。更多信息请关注PHP中文网其他相关文章!