在JavaScript中复制对象属性

Copy object properties in JavaScript

本文关键字:对象 属性 复制 JavaScript      更新时间:2023-09-26

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

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用于所有类?

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

如果您要使用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
}

我不确定你是否知道,但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();
Ivan展示了如何从对象继承。关于使用构造函数函数和固有性的更多信息可以在这里找到:原型继承-编写

您也可以使用混合模式:

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);