Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.08.2018, 18:56
R2R R2R вне форума
Интересующийся
Отправить личное сообщение для R2R Посмотреть профиль Найти все сообщения от R2R
 
Регистрация: 22.08.2018
Сообщений: 13

Добавление объекта с методами к конструктору
Приветствую!
Можно ли после создания конструктора добавить к нему объект с методами, использующими методы этого конструктора?
function CreateTest(name) {
	this.name = name;
	this.roll = () => ["simple", "hard"][Math.round(Math.random())];

/*
// объявление объекта внутри конструктора работает
	this.renameObj = {
		rename: function() {
 			return this.name = `${this.roll()} ${this.name}`;
 		}.bind(this)
	};
*/
}

/*
// добавление объекта после объявления конструктора не работает
	CreateTest.renameObj = {
		rename: function() {
 			return this.name = `${this.roll()} ${this.name}`;
 		}.bind(CreateTest)
	};
*/

let test = new CreateTest("js test");

test.renameObj.rename();
Ответить с цитированием
  #2 (permalink)  
Старый 23.08.2018, 20:57
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

В javascript прототипное наследование.
Все методы добавляются в любое время в CreateTest.prototype.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 23.08.2018, 21:09
R2R R2R вне форума
Интересующийся
Отправить личное сообщение для R2R Посмотреть профиль Найти все сообщения от R2R
 
Регистрация: 22.08.2018
Сообщений: 13

Так тоже не работает
CreateTest.prototype.renameObj = {
		rename: function() {
 			return this.name = `${this.roll()} ${this.name}`;
 		}.bind(CreateTest)
	};

Выдает ошибку "this.roll is not a function".
Ответить с цитированием
  #4 (permalink)  
Старый 23.08.2018, 21:18
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,126

Ты ищешь свойство у объекта созданного функцией а добавляешь свойство самой функции которая тоже ведет себя как объект.
Естественно объект созданный функцией и функция создающая объект это разные объекты и свойства у них разные

Последний раз редактировалось MallSerg, 23.08.2018 в 21:21.
Ответить с цитированием
  #5 (permalink)  
Старый 23.08.2018, 21:22
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

Забавная задачка, ибо каждый объект в js независим, и никак обратно не связан со своим "родителем". Тут надо подумать, как сделать по-красивее.(но лучше вообще так не делать)
__________________
29375, 35
Ответить с цитированием
  #6 (permalink)  
Старый 23.08.2018, 21:27
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,126

А как же свойство Obj.__proto__.constructor ?
Ответить с цитированием
  #7 (permalink)  
Старый 23.08.2018, 21:47
R2R R2R вне форума
Интересующийся
Отправить личное сообщение для R2R Посмотреть профиль Найти все сообщения от R2R
 
Регистрация: 22.08.2018
Сообщений: 13

Думаю, надо объяснить, откуда вообще взялась эта задача. Я пишу библиотеку для работы с анимациями. В ее основе конструктор, содержащий свойства - координаты передаваемого в качестве аргумента DOM элемента, часть методов предназначена для работы с этими свойствами, а остальные методы - это методы-обертки, необходимые для вызова пользовательских функций (упакованных вместе с их параметрами в объекты). Т.е. пользователь может написать простую функцию, меняющую координаты элемента по некой формуле, поместив ее со своими параметрами в объект, затем вызвать ее через функцию обертку с промисом и raf. При этом он абстрагируется от асинхронной логики и думает только над уравнением перемещения. Чтобы это осуществить, как раз и требуется добавить объект в конструктор (тоже через обертку, чтобы это мог делать пользователь-новичок, не знакомый с ООП в js).
Ответить с цитированием
  #8 (permalink)  
Старый 23.08.2018, 21:53
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

MallSerg, под "родителем" я имел ввиду не конструктор, а тот объект в котором он лежит. Наверно надо было сказать "никак не связан со своим контейнером"?)
__________________
29375, 35
Ответить с цитированием
  #9 (permalink)  
Старый 23.08.2018, 23:18
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,126

Aetae,
То же не совсем понятно
Есть родитель на которого всегда ссылка obj.prototype
Есть функция создающая объект на которую указывает ссылка Obj.__proto__.constructor
Есть this который динамически заменяется и всегда указывает в контексте какого объекта он исполняется.
<script>
function GetName() { return this.name; }

var vasa = {name: "Вася"};
var lena = {name: "Лена"};
var petia = {name: "Петя"};

vasa.gn = GetName;
lena.gn = GetName;
petia.gn = GetName;

document.write ( vasa.gn() + "<br>") ;
document.write ( lena.gn() + "<br>") ;
document.write ( petia.gn() + "<br>") ;
</script>


R2R,
Без конкретного тестового примера понять что то сложно возможно использование наследования поможет
небольшой пример
<script>
function CreateTest (){
	this.__proto__ = CreateTest;
	this.x = 5;
	this.y = 20;
}

var ele = new CreateTest();

CreateTest.newFunc = function ( par){
	alert ( this.x + this.y + par );
}	;

ele.newFunc ("----");
</script>
Ответить с цитированием
  #10 (permalink)  
Старый 24.08.2018, 13:01
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

MallSerg, он хочет примерно такую наркоманию:
function CreateTest(name) {
    this.name = name;
    this.roll = () => ["simple", "hard"][Math.round(Math.random())];

    /*
// объявление объекта внутри конструктора работает
    this.renameObj = {
        rename: function() {
            return this.name = `${this.roll()} ${this.name}`;
        }.bind(this)
    };
*/
}

Object.bindedAppend = function(parent, name, child){
    Object.defineProperty(parent.prototype, name, {
        configurable: true,
        enumerable: true,
        get: function(){
            if(this === parent.prototype)
                return child;

            return this[name] = new Proxy(this, {
                get: (p, key) => key in child ? child[key] : this[key],
                set: (p, key, val) => this[key] = val
            })
        }
    });
    return child                    
};


Object.bindedAppend(CreateTest, 'renameObj', {
    rename: function() {
        return this.name = `${this.roll()} ${this.name}`;
    }
});

var test3 = new CreateTest("js test");
test3.renameObj.rename();

alert(test3.name)
__________________
29375, 35
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление объекта, при создании, в массив Egor_735_jr Общие вопросы Javascript 5 15.08.2018 13:08
Добавление объекта в массив в цикле Dark19 Элементы интерфейса 3 11.12.2016 23:11
Динамическое добавление объекта во время анимации three.js Ni55aN Общие вопросы Javascript 0 11.11.2014 22:24
Добавление объекта в объект Sweet Общие вопросы Javascript 4 07.07.2010 17:51
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00