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);


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