Как написать функцию клона JavaScript, которая может копировать добавленные методы объекта? - PullRequest
0 голосов
/ 16 сентября 2011

У меня есть вопрос клонирования javascript-объекта. Я хотел бы иметь возможность клонировать методы объекта, которые были изменены по сравнению с теми, которые определены прототипом объекта или добавлены в объект после создания экземпляра. Возможно ли это?

Настройка здесь - это определенный мной класс javascript, так что я в порядке, когда пишу метод клонирования, специфичный для моего класса объектов. Я просто не могу понять, как копировать методы.

Пример:

function myObject( name, att, dif ) {
    /* 'privileged' methods */
    this.attribute = function(newAtt) {  // just a getter-setter for the 'private' att member
        if(newAtt) { att = newAtt; }
        return att;
    }
    // 'public' members
    this.printName = name;
}

myObject.prototype.genericMethod = function() {
    // does what is usually needed for myObjects
}


/* Create an instance of myObject */
var object153 = new myObject( '153rd Object', 'ABC', 2 );
// object153 needs to vary from most instances of myObject:
object153.genericMethod = function() {
    // new code here specific to myObject instance object153
}
/* These instances become a collection of objects which I will use subsets of later. */


/* Now I need to clone a subset of myObjects, including object153 */
var copyOfObject153 = object153.clone();
// I want copyOfObject153 to have a genericMethod method, and I want it to be the one
// defined to be specific to object153 above.  How do I do that in my clone() method?
// The method really needs to still be called 'genericMethod', too.

Ответы [ 2 ]

1 голос
/ 16 сентября 2011

В вашей функции клонирования протестируйте каждый метод объекта, чтобы увидеть, равен ли он тому же методу в прототипе конструктора объекта.

if (obj[method] != obj.constructor.prototype[method])
    clone[method] = obj[method];
0 голосов
/ 16 сентября 2011

Звучит так, будто вам просто нужна мелкая копия.Однако остерегайтесь того, что объекты распределяются между экземплярами, поскольку мы не копируем глубоко.

function clone(obj) {
   var newObj = new obj.constructor();
   for (var prop in obj) {
     newObj[prop] = obj[prop];
   }
   return newObj;
}
var cloned = clone(object153);

Другой синтаксис будет

myObj.prototype.clone = function() {
   var newObj = new this.constructor();
   for (var prop in this) {
     newObj[prop] = this[prop];
   }
   return newObj;
}
var cloned = object153.clone();

Попробуйте и посмотрите, работает ли он для вас, все еще трудно сказать, что ты делаешь.Если это не так, объясните почему, тогда я смогу лучше понять проблему.

...