Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как добавить методы объекту после конструирования. (https://javascript.ru/forum/misc/34716-kak-dobavit-metody-obektu-posle-konstruirovaniya.html)

DragorWW 16.01.2013 12:59

Как добавить методы объекту после конструирования.
 
Добрый день. Есть следующая логика: Функция конструктор Board создаёт объект board;

random = function () {
	var min = 1;
	var max = 20;
	return Math.floor(Math.random() * (max - min) + min);
}
Board = function() {
	var _board = [];
	_board.width = 15;
	_board.height = 40;
	var set = function () {
		for (var i = 0; i < _board.width; i++) {
			_board.push([])
			for (var ii = 0; ii < _board.height; ii++) {
				_board[i].push(random());
			}
		}
	}.call(set)
	return _board;
}
board = Board();

board будет типа Array. нужно добавить всем объектам созданным через Board ещё один метод. Как бы это сделать получше.
Так как в моём варианте Board.prototype.someMethod не прокатет так как board не связан с ним.
Ну или как можно конструировать массивы с определёнными методами иначе.

DragorWW 16.01.2013 14:13

Цитата:

Сообщение от рони (Сообщение 227534)
DragorWW,
Понятно что пример, но зачем строки 12,13 и 15 ???

может не правельно понял вопрос, но мм... делают матрицу X на Y

рони 16.01.2013 14:48

DragorWW,
ок я неудачно скопировал код

nerv_ 16.01.2013 17:52

Цитата:

Сообщение от DragorWW
var _board = [];
_board.width = 15;
_board.height = 40;

считаете нормальным так делать?

DragorWW 17.01.2013 00:40

Цитата:

Сообщение от nerv_ (Сообщение 227593)
считаете нормальным так делать?

считаю удобным так делать. так как переменная при обращение ведёт себя как мастив но при этом содержит так же дополнительную информацию и функции.

Но если скажите почему так делать нельзя/не желательно я буду очень признателен.

monolithed 17.01.2013 07:15

var foo = function (param) {
      this.property = param;

};

foo.prototype = {
      constructor: foo,
      method: function () {
             return this.property;
      }
}; 

var object = new foo (2);
alert(object.method()); // 2

object.constructor.prototype.method_2 = function() {
       return this.property * 2;
};

var object_2 = new foo(3);
alert([
   object.method_2(),    // 4
   object_2.method_2(),  // 6
   new foo(3).method_2() // 6
]);

ksa 17.01.2013 13:16

Если я правильно понимаю....
Цитата:

Сообщение от DragorWW
добавить всем объектам созданным через Board ещё один метод

Не получится.
В примере monolithed просто делается еще один объект object_2, но у object ничего не добавилось...

nerv_ 17.01.2013 19:37

Цитата:

Сообщение от DragorWW
Но если скажите почему так делать нельзя/не желательно я буду очень признателен.

потому, что это массив. А вы подмешиваете ему логику объекта (что не очевидно)

Dmitriyff 18.01.2013 12:05

Цитата:

Сообщение от nerv_
потому, что это массив. А вы подмешиваете ему логику объекта (что не очевидно)

поэтому поводу можно много холиварить, js достаточно гибок, если это не мешает другим, а свою работу облегчает, это будет только к лучшему.

monolithed,
foo.prototype = {
      constructor: foo, // это лишнее, и без него будет работать
      method: function () {
             return this.property;
      }
};


DragorWW,
если вам нужен массив, то вариант только один, в функции Broad добавить _broad.someMethod = ...

ибо если вы это сделаете так Array.prototype.someMethod = ...
то конечно все объекты _broad будут иметь этот метод, но это плохой тон, хотя вам решать

Сделать наследование от массива и не утратить саму его суть
a[0] = 1;
a.length = 1;
a[1] = 2;
a.length = 2;

у меня не вышло, но я и не считаю себя гуру =-), возможно есть решения

monolithed 18.01.2013 15:50

Цитата:

Сообщение от Dmitriyff
constructor: foo, // это лишнее, и без него будет работать

Не нужно писать чушь если вы что-то не понимаете!

var object = {};
object.constructor.prototype.property = 1;

alert([].property);

Dmitriyff 20.01.2013 21:12

monolithed,
возможно и не понимаю, но в вашем примере это было лишнее.

http://www.mail-archive.com/jsmentor.../msg00513.html

это вы видимо пример как делать не надо?
var object = {};
object.constructor.prototype.property = 1;

alert([].property);

megaupload 20.01.2013 21:24

Цитата:

Как добавить методы объекту после конструирования.
function Rabbit (){}

var rabbit = new Rabit;
rabbi.run = function(){} // добавим только этому созданному кролику

Rabbit.prototype.say = function(){} // добавим всем кроликам уже созданным и в будущем создаваемым

megaupload 20.01.2013 21:33

Прочитал вопрос.

var arr = [1,2,3,4,5];

function MegaArray(){
    this.ololo = function(){};
}

MegaArray.call(arr); // примешаем свойства и методы MegaArray в массив arr


теперь arr это смесь MegaArray и Array

nerv_ 20.01.2013 21:51

function Board() {}

Board.method = function() {
    alert( 1 );
};

var arr = [];

arr.method = Board.method;

alert( arr.push );
alert( arr.method );

только это все извращения

Цитата:

Сообщение от megaupload
теперь arr это смесь MegaArray и Array

с чего вдруг?

прям ниндзя :)
Цитата:

var set = function () {
    for (var i = 0; i < _board.width; i++) {
        _board.push([])
        for (var ii = 0; ii < _board.height; ii++) {
            _board[i].push(random());
        }
    }
}.call(set)

var set = function (x) {
    alert( x );
}.call(set);

megaupload 20.01.2013 21:58

Цитата:

Сообщение от nerv_
с чего вдруг?

Потому что мы прошлись по объекту arr конструктором Array и конструктором MegaArray; Я думаю вам стоит почитать про наследование на примесях;

nerv_ 20.01.2013 22:18

Цитата:

Сообщение от megaupload
конструктором MegaArray

я бы не стал называть MegaArray конструктором. Скорее "функция для смешивания".
Цитата:

Сообщение от megaupload
наследование на примесях

? :blink:

megaupload 20.01.2013 22:52

Да, применяешь функции для смешивания последовательно в порядке наследования от родительского класса к дочернему, дочерние методы и свойства оверфловят родительские если имена совпадают; Тут даже статья должна быть в учебнике; Поищу ссылку дам;

нашел http://habrahabr.ru/post/147901/

nerv_ 20.01.2013 23:56

Дзен-трансгуманист, вот поэтому мой мозг взрывает фраза
Цитата:

Сообщение от megaupload
наследование на примесях

примеси, не более. Наследование? Нет.

megaupload, за ссылку спасибо. Я ее уже видел.

megaupload 21.01.2013 00:34

Дзен-трансгуманист,
Это потому что вы путаете наследование на прототипах и наследование на примесях; Почитайте про наследование на прототипах;

nerv_,
Почитайте про наследование;

Dmitriyff 21.01.2013 12:22

megaupload,
Вы бы хоть ссылку разместили, какую-нить про "наследование на примесях", а то это звучит как некая неведомая ... в вакууме, а мы то люди мало грамотные (вспоминаем отзыв ваш нелестный), сами поисковками ни разу не пользовавшиеся, вряд ли справимся

Dmitriyff 21.01.2013 12:28

megaupload,
Ну и да, хотелось бы подчеркнуть, что в бурно разивающемся интернете, первую попавшуюся статью не стоит оценивать как догму...

megaupload 21.01.2013 16:43

Дзен-трансгуманист,
То есть все что я говорю автоматически становится неправдой? даже если я говорю правду?

megaupload 21.01.2013 18:26

Дзен-трансгуманист,
Я прям как телевизор.

megaupload 21.01.2013 20:39

Дзен-трансгуманист,
Вот вот. Луркай поменьше и мне верь побольше. А лучше не верь, а проверяй.


Часовой пояс GMT +3, время: 14:22.