2013-08-15 3 views
1

У меня есть несколько пользовательских определений объектов, как:Копирование свойств объекта в 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?

Лучше ли (имитировать) наследовать эту функцию от типа Object в JavaScript или лучше использовать глобальную функцию или определить ее по отдельности?

+0

насчет Class2.prototype = Class1.prototype; ? –

+0

В вашем коде, что такое 'obj'? Похоже, вы пытаетесь определить свойства по умолчанию для своих объектов? –

+0

Что вы на самом деле пытаетесь сделать? Вы хотите сделать «клонирование объектов»? Свойства объектов могут быть структурированными объектами, поэтому вы будете работать с «ссылками». Вы должны создать специальный метод клонирования для каждого класса. –

ответ

2

Если вы собираетесь использовать библиотеку, такие как JQuery или подчеркивания, вы уже имеете доступ к упругому extend методу (см $.extend и _.extend), так что я бы сказал, что нет никаких причин, чтобы изобретать колесо по этим типам пользовательских объектов.

В противном случае, вы можете иметь Class1 и Class2 наследуют от общего базового класса:

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 
} 
+0

Это как-то разрывает определение класса? или я использую неправильно? [http://jsfiddle.net/jaxkodex/C55Lc/](http://jsfiddle.net/jaxkodex/C55Lc/) – jaxkodex

+0

@jaxkodex, ваша функция 'printMe' является ошибкой (должна быть' str + = ... ' , а не 'str = ...'), но в любом случае вы не должны запускать свой собственный инспектор объектов. Используйте 'console.log' и консоль dev (обычно F12). – zzzzBov

+0

@zzzBov Почему использование 'str = str +' является ошибкой? и я использую console.log для проверки переменных, но для примера print это было нормально ... – jaxkodex

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(); 
+0

Я имел в виду симулировать ... – jaxkodex

0

Иван показал, как наследовать от объекта. Более подробная информация об использовании функции конструктора и inherritance можно найти здесь: Prototypical inheritance - writing up

Вы можете использовать шаблон подмешать, а также:

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); 
Смежные вопросы