JavaScript反映了所有对象引用中的属性更改

时间:2016-10-07 08:47:28

标签: javascript reference

我需要遍历嵌套对象类并在对象中提取它们的属性。但是,从对象内部更改属性值并不会更改保存这些对象的根对象的变量中的值。当我从对象内部检查时,正确应用了新值。

但是,如果我添加新属性而不是添加现有属性,我可以访问新属性。

js fiddle

    var OO = function(o, parent){
        this.parent = parent || null;
        this.init(o);
        return this;
    };

    OO.prototype = {
        init: function(o){
            this.obj = typeof o === 'object' ? new OO(o.name, this) : o;
            this.type = typeof o === 'object' ? 'object' : 'string';

            if( typeof o === 'string' ){
                this.change();
                console.log(this.parent); // Here top-level oo object holds values called in change() function. I want the variable ( oo_var ) holding this top-level oo to have same property values too.
                this.add();
            }               
        },

        change: function(){
            this.parent.obj = 'Orange'; // Holds {} before changing
            this.parent.type = 'string'; // 'object' before changing
        },

        add: function(){
            this.parent.another_obj = 'Another';
            this.parent.another_type = 'another string';
        }
    };

    var oo_var = new OO({name: 'Apple'}); // This var doesn't refresh the obj & type property values applied in change() function. But has properties added in add() function.

我有很多级别的嵌套对象,每个级别都有兄弟姐妹。

1 个答案:

答案 0 :(得分:1)

构造函数应该只进行创建,而不是更改任何状态。它不需要调用init方法,它绝对不应该调用(甚至间接)change方法。

成功

function OO(o, parent) {
    this.parent = parent || null;
    this.type = typeof o;
    this.obj = this.type === 'object' ? new OO(o.name, this) : o;
}
OO.prototype.change = function() {
    this.parent.obj = 'Orange'; // Holds {} before changing
    this.parent.type = 'string'; // 'object' before changing
};
OO.prototype.add = function(){
    this.parent.another_obj = 'Another';
    this.parent.another_type = 'another string';
};

var oo_var = new OO({name: 'Apple'});
console.dir(oo_var);
oo_var.obj.change();
oo_var.obj.add();
console.dir(oo_var);

让孩子改变父母而不是父母改变自己也有点奇怪(if not wrong)。

如果您不想自己调用这些方法,可以使用以下方法:

OO.prototype.init = function() {
    if (this.type === 'object' ) {
        this.obj.init();
    } else if (this.type === 'string') {
        this.change();
        this.add();
    }
};

var oo_var = new OO({name: 'Apple'});
console.dir(oo_var);
oo_var.init();
console.dir(oo_var);