Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
47 / 47 / 6
Регистрация: 10.05.2012
Сообщений: 236

Паттерн для создания класса

12.06.2015, 11:16. Показов 1311. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Поздравляю всех с праздником!

Есть функция для создания новых образцов класса. По всему должна работать, но не работает.

ДЕМО

Я чувствую, что где-то рядом с решением и наверняка ошибка очевидна, но не могу найти. Подскажите, пожалуйста.

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
NEW = function(constructor, args) {
 
var ist = {};
    ist.prototype = Object.create(constructor);
    ist.prototype.constructor = ist;
    return constructor.apply(ist,args);
    return ist;
 
    
};
 
Person.prototype.speak = function(){ alert(2); };
var alex = NEW(Person, ['Alex']);
alex.speak();
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.06.2015, 11:16
Ответы с готовыми решениями:

Посоветуйте паттерн для сверки всех объектов класса между собой
Друзья, нужен совет. Есть потребность произвести сверку всех объектов класса между собой. В зависимости от результатов, обработка. ...

Создания потомка для класса
Нужна помощь! Имеется класс студенты. Структура класса состоит из (ФИО, возраст, университет). Необходимо к этому классу написать...

Создания класса для работы с БД
Доброе утро, делаю контрольное задание по ООП и СУБД, суть задачи такая 1) Создать класс для работы с БД(СУБД выбираете сами) 2)...

15
134 / 130 / 57
Регистрация: 29.12.2011
Сообщений: 359
14.06.2015, 00:52
Вы разделом ошиблись, этот раздел про фреймворк Prototype.
А ваш код не должен работать, потому что он похож на копипасту отдельных строк из других кусков кода.
Какая стояла задача хотя бы?
Какой класс? Что должен делать?
0
47 / 47 / 6
Регистрация: 10.05.2012
Сообщений: 236
14.06.2015, 01:13  [ТС]
Прошу прощения за ошибку с разделом. Копипаст из MDN. Задача стоит написать функцию - конструктор, которая возвращает новый объект. Так, чтобы можно было вызвать ее таким образом:
JavaScript
1
2
3
Person.prototype.speak = function(){ alert(2); };
var alex = NEW(Person, ['Alex']);
alex.speak();
По моему представлению, цепочка наследования должна быть такой:
Создается пустой объект.
Он наследует родителя (constructor)
Возвращается объект - образец класса, населдующий свойства конструктора.

Такой вариант тоже не сработал

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
NEW = function(constructor, args) {
 
    var ist = {};
    ist.__proto__ = constructor;
    
   
  constructor.apply(ist, Array.prototype.slice.call(arguments, 1));
     return ist;
    
};
 
 
Person.prototype.speak = function(){ alert(2); };
var justin = NEW(Person, ['Justin']);
justin.speak();
Консоль говорит о том, что функция - конструктор Person не найдена. Я чувствую, что ошибка в том, что я не могу соединить образец ist и родителя person.

Ошибка в этой строчке

JavaScript
1
ist.prototype = Object.create(constructor);
Но не могу понять, как исправить
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
14.06.2015, 01:31
JavaScript
1
2
3
4
5
6
7
8
var Person = function (name) {
        this.name = name;
};
Person.prototype.speak = function () {
        alert(this.name);
};
var alex = new Person('Alex');
alex.speak();
new - это зарезервированное имя трогать такие имена не рекомендуется
1
47 / 47 / 6
Регистрация: 10.05.2012
Сообщений: 236
14.06.2015, 01:57  [ТС]
Да, спасибо. Классическое наследование я знаю, как написать. Мне API написать нужно Про new да, согласна, спасибо.

Добавлено через 12 минут
Функция со stackoverflow тоже не работает

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function New(func) {
    var res = {};
    if (func.prototype !== null) {
        res.__proto__ = func.prototype;
    }
    var ret = func.apply(res, Array.prototype.slice.call(arguments, 1));
    if ((typeof ret === "object" || typeof ret === "function") && ret !== null) {
        return ret;
    }
    return res;
}
 
A.prototype.speak = function() {
    return alert(2);
}
 
var obj = New(A, 1, 2);
 
//var obj = new A(1, 2);
obj.speak();
0
134 / 130 / 57
Регистрация: 29.12.2011
Сообщений: 359
14.06.2015, 02:38
Цитата Сообщение от sheila Посмотреть сообщение
Функция со stackoverflow тоже не работает
Эта функция - демонстрация принципа работы оператора new. Использовать её незачем.
Чем вам вариант от Poznakomlus не устроил? Это не классическое наследование, это прототипное.
И при чём тут вообще API?
0
47 / 47 / 6
Регистрация: 10.05.2012
Сообщений: 236
14.06.2015, 02:53  [ТС]
Вариант Poznakomlus хороший.
Но мне нужно понять, почему не работает функция на stackoverflow. Или может, я ее не так вызываю. Если я не пойму эту функцию, то не пойму наследование в целом. Функция вроде бы рабочая, но не работает! Почему?
0
134 / 130 / 57
Регистрация: 29.12.2011
Сообщений: 359
14.06.2015, 12:45
Потому что у Вас нет конструктора А, определите его
0
47 / 47 / 6
Регистрация: 10.05.2012
Сообщений: 236
14.06.2015, 12:53  [ТС]
То есть вот этот код необходимо прописать явно?

JavaScript
1
2
3
var Person = function (name) {
        this.name = name;
};
Тогда какой же смысл во всей остальной конструкции?

Когда пробую сделать так, как рекомендует MDN

res.prototype = Object. create(func.prototype);
код тоже не работает
0
134 / 130 / 57
Регистрация: 29.12.2011
Сообщений: 359
14.06.2015, 15:32
Цитата Сообщение от sheila Посмотреть сообщение
То есть вот этот код необходимо прописать явно?
Да, кто же его за Вас сочинит? Интерпретатор?
Цитата Сообщение от sheila Посмотреть сообщение
Тогда какой же смысл во всей остальной конструкции?
В какой именно? В реализации оператора new? Никакого смысла. Он и так реализован
Судя по Вашим вопросам, Вам нужно брать хороший учебник по JS и с самого начала изучать, а не копипастить код и спрашивать почему он не работает.
1
47 / 47 / 6
Регистрация: 10.05.2012
Сообщений: 236
15.06.2015, 19:01  [ТС]
Так в том то и дело, что я сначала написала функцию, как она должна быть, а потом удалила

JavaScript
1
2
3
var Person = function (name) {
        this.name = name;
}
;

У меня возник вопрос, если она и так должна работать:

JavaScript
1
2
3
4
5
6
7
8
9
10
function Person(name){
    this.name = name;
};
 
Person.prototype.speak = function(){ alert(this.name) };
 
var justin = new Person('Justin');
justin.speak();
 
console.dir(justin);
Зачем тогда мне нужно вся эта конструкция:

NEW = function(constructor, args) {

var ist = {};
ist.__proto__ = constructor.prototype;
constructor.apply(ist,args);
return ist;

};

Вот чего я никак не пойму!!!

Добавлено через 4 минуты
Это был тест на знание js, думала, что весь смысл в том, чтобы избежать явного обозначения функции-конструктора.
0
Модератор
 Аватар для Thisman
771 / 352 / 142
Регистрация: 17.07.2013
Сообщений: 992
15.06.2015, 19:08
sheila, вообще довольно странная реализация, но вполне имеет право на жизнь. Хотя вроде бы доступ к свойству _proto_ запрещен или нежелателен

Разница в том, что в первом случае

Цитата Сообщение от sheila Посмотреть сообщение
У меня возник вопрос, если она и так должна работать:
JavaScript
1
2
3
4
5
6
7
function Person(name){
   this.name = name;
};
Person.prototype.speak = function(){ alert(this.name) };
var justin = new Person('Justin');
justin.speak();
console.dir(justin);
Нет реализации наследования классов, вы создаете экземпляр класса, но он не сможет унаследовать свойство другого класса, в данном примере нет такого функционала

Во втором же случае довольно странны код, ибо в функции два return бесполезны.
1
47 / 47 / 6
Регистрация: 10.05.2012
Сообщений: 236
15.06.2015, 21:20  [ТС]
Thisman, спасибо за ответ. Я поняла, нужно также было вызвать родителя через call или apply, чтобы унаследовать свойства. Наверное, это недостающее звено и делает функция NEW
0
388 / 275 / 76
Регистрация: 19.09.2011
Сообщений: 828
16.06.2015, 09:10
Лучший ответ Сообщение было отмечено sheila как решение

Решение

правильно так
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
function NEW(constructor, arguments){
  var instance = Object.create(constructor.prototype);
  constructor.apply(instance, arguments);
  return instance;
}
 
var Person = function (name) { // <- без этого работать не будет и не должно
        this.name = name;
};
 
Person.prototype.speak = function(){ alert(2); };
var alex = NEW(Person, ['Alex']);
alex.speak();
во первых если Person не определено, то логично что выведет ошибку про undefined, во вторых если его нет то что делать с аргументом 'Alex'?

Цитата Сообщение от sheila Посмотреть сообщение
Тогда какой же смысл во всей остальной конструкции?
нет смысла, бесполезная вещь, в текущем виде нужна только для того что бы передать в конструктор массив аргументов, например у коструктора список параметров func asd(asd1, asd2, asd3), а я хочу сделать так new asd([asd1, asd2, asd3]) вместо new asd(asd1, asd2, asd3)
1
134 / 130 / 57
Регистрация: 29.12.2011
Сообщений: 359
16.06.2015, 12:04
Цитата Сообщение от sheila Посмотреть сообщение
думала, что весь смысл в том, чтобы избежать явного обозначения функции-конструктора
В этом нет ни смысла ни пользы, объекты можно создавать без конструктора и без всяких реализаций стандартных операторов. И прототипы для объектов тоже можно без конструктора указывать.
Конструкторы придумывали не для того, чтобы их избегать
1
47 / 47 / 6
Регистрация: 10.05.2012
Сообщений: 236
16.06.2015, 12:49  [ТС]
nubideus, большое спасибо, все прояснилось теперь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.06.2015, 12:49
Помогаю со студенческими работами здесь

Функция для создания объектов указанного класса
Всем привет, задача такая, как реализовать не знаю. Имеется - базовый класс TMyClass = class (TForm) И N-ое кол-во классов потомков: ...

Классическая задача создания класса для работы со StringBuilder
Привет. Стандартная задача по написанию класса работы со строками. Конструктор, методы, свойства. Все написал, кроме одного последнего...

Присвоить переменной тип абстрактного класса для последующего создания
Суть проблемы в классе House. Мы в цикле каждый раз делаем проверку какой класс создавать Dog или Cat. Я бы хотел проводить проверку 1...

Реализовать внешние функции для создания и уничтожения объектов класса
Здравствуйте, имеется вот такое задание: Создайте класс с закрытыми конструкторами и деструктором. Реализуйте внешние функции для...

Паттерн "Итератор" для шаблонного класса "Словарь"
Препод дал задание сделать шаблонный словарь и реализовать для него иттератор. Сделал словарь, но как работать с иттератором я понятия не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru