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

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

12.06.2015, 11:16. Показов 1304. Ответов 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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 17.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 14.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru