У меня есть несколько объектов javascript, например:
var object = {
name: "object name",
description: "object description",
properties: [
{ name: "first", value: "1" },
{ name: "second", value: "2" },
{ name: "third", value: "3" }
]
};
Теперь я хотел изменить эти объекты на более умные объекты (добавив некоторые методы и т.д.).
Сначала я создал такую конструкторскую функцию:
SmartObject = function( object ){
this.name = object.name;
this.description = object.description;
this.properties = object.properties;
};
SmartObject.prototype.getName = function(){
return this.name;
};
SmartObject.prototype.getDescription = function(){
return this.description;
};
SmartObject.prototype.getProperies = function(){
return this.properties;
};
И затем я использовал этот конструктор для изменения моего объекта на экземпляр SmartObject
следующим образом:
var smartObject = new SmartObject( object );
Для этого кажется правильным объектно-ориентированным javascript-кодом, но это слишком сложно, поскольку все, что я действительно хочу сделать, это добавить некоторые методы, и теперь я копирую все свойства из object
в SmartObject
в SmartObject
в конструктор.
В этом примере есть только 3 свойства и некоторые простые методы, но в моем проекте есть несколько десятков (вложенных) свойств и более сложные методы.
Итак, я пробовал это:
object.__proto__ = SmartObject.prototype;
И это, по-видимому, приводит к точному такому же результату и кажется намного проще (проверьте эта скрипка для этого пример).
Является ли это правильным и приемлемым способом добавления прототипа к моему объекту? Или - это ломающиеся объектно-ориентированные шаблоны и считается плохой практикой, и я должен продолжать делать то, что сделал (используя конструктор).
Или может быть еще один приемлемый способ добавления методов к моему существующему объекту, не вытягивая его через конструктор?
Примечание. Я попытался найти такой пример в StackOverflow, но при поиске я всегда заканчиваю примерами, расширяющими прототип существующих классов javascript. Если есть такой вопрос, не стесняйтесь отмечать это как дубликат, и я снова закрою свой вопрос.