在JavaScript中复制对象属性

时间:2013-08-15 17:00:36

标签: javascript

我有一些自定义对象定义,如:

var Class1 = function () { this.value = ''; };
var Class2 = function () { this.data = ''; };

Class1.prototype = {
    setObject: function () {
        for (var prop in this){
            if (typeof obj[prop] != 'undefined')
                this[prop] = obj[prop];
        }
    }
}

Class2.prototype = {
    setObject: function () {
        for (var prop in this){
            if (typeof obj[prop] != 'undefined')
                this[prop] = obj[prop];
        }
    }
}

默认情况下,是否可以将此方法setObject用于所有clases?

(模拟)从JavaScript中的Object类型继承该函数是否更好?或者更好地使用全局函数或逐个定义它?

3 个答案:

答案 0 :(得分:2)

如果您要使用jQuery或下划线等库,则您已经可以使用弹性extend方法(请参阅$.extend_.extend),所以我想说没有理由重新发明这些自定义对象类型的轮子。

否则,您可以从公共基类继承Class1Class2

function BaseClass() {
    ...
}
BaseClass.prototype = {
    setObject: function (obj) {...}
};

function Class1() {
    ...
}
Class1.prototype = new BaseClass();

function Class2() {
    ...
}
Class2.prototype = new BaseClass();

var a = new Class1();
a.setObject({...});

var b = new Class2();
b.setObject({...});

或者,如果这些对象不应包含共同的祖先,您可以将它们定义为使用相同的setObject函数引用:

function setObject(obj) {
    ...
}

function Class1() {
    ...
}
Class1.prototype = {
    setObject: setObject
};
function Class2() {
    ...
}
Class2.prototype = {
    setObject: setObject
}

答案 1 :(得分:0)

我不确定你是否知道,但Javascript中没有类或方法。只有对象,函数和称为“原型”的特殊属性。

模拟类的常用方法是:

var Class  = function () { this.prop = "hi" };
Class.prototype.doMethod = function () { this.prop = "hi2"; };
Class.prototype.setObject: function () {
    for (var prop in this){
        if (typeof obj[prop] != 'undefined')
            this[prop] = obj[prop];
    }
}

// those classes "inherit" from Class
var Class1 = function () { Class.call(this); this.value = ''; };   
Class1.prototype = new Class();

var Class2 = function () { Class.call(this); this.data  = ''; };
Class2.prototype = new Class();

答案 2 :(得分:0)

伊万展示了如何从一个物体继承。有关使用构造函数和继承的更多信息,请访问:Prototypical inheritance - writing up

你也可以使用mixin模式:

var mixIn=function(target,source){
  for(fn in source){
    if(source.hasOwnProperty(fn)){
      target.prototype[fn]=source[fn];
    }
  }
};
var ObjectSettable = {
    setObject: function () {
        for (var prop in this){
            if (typeof obj[prop] != 'undefined')
                this[prop] = obj[prop];
        }
    }
};
var Class1 = function () { this.value = ''; };
//... Class1.prototype stuff
mixIn(Class1,ObjectSettable);