每天一个前端知识(67):只将实例状态存储在实例对象中

frontend

Posted by Tiny on July 31, 2017
// 实现一个简单的树形结构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 ] } ]

谨记

共享可变数据可能会出现问题,因为原型是被所有的实例共享的。

将可变的实例状态存储在实例对象中。

参考资料:https://lee134134134.github.io/page/5/