Skip to content

Latest commit

 

History

History
57 lines (53 loc) · 1.45 KB

store-instance-state-only-on-instance-objects.md

File metadata and controls

57 lines (53 loc) · 1.45 KB

只将实例状态存储在实例对象中

// 实现一个简单的树形结构L类
// @1 错误的实现方式
function Tree(value) {
    this.value = value
}
Tree.prototype = {
    children: [],
    addChild: function(value) {
        this.children.push(value);
    }
};
var left = new Tree(1);
left.addChild(2);
left.addChild(3);
console.log(left.children); // [ 2, 3 ]
var right = new Tree(4);
right.addChild(5);
right.addChild(6);
var top = new Tree(7);
top.addChild(left);
top.addChild(right);
console.log(left.children); // [ 2, 3, 5, 6, { value: 1 }, { value: 4 } ]
console.log(top.children); // [ 2, 3, 5, 6, { value: 1 }, { value: 4 } ]

// @2 正确的实现方式 将状态存储在每个实例中
function Tree1(value) {
    this.value = value;
    this.children = []
}
Tree1.prototype = {
    addChild: function(value) {
        this.children.push(value);
    }
};
var left1 = new Tree1(1);
left1.addChild(2);
left1.addChild(3);
console.log(left1.children); // [ 2, 3 ]
var right1 = new Tree1(4);
right1.addChild(5);
right1.addChild(6);
var top1 = new Tree1(7);
top1.addChild(left1);
top1.addChild(right1);
console.log(left1.children); // [ 2, 3 ]
console.log(top1.children); // [ { value: 1, children: [ 2, 3 ] },{ value: 4, children: [ 5, 6 ] } ]

源码


源码

  • 共享可变数据可能会出现问题,因为原型是被所有的实例共享的。
  • 将可变的实例状态存储在实例对象中。