Как описывать свойства ООП?
Если какие то методы в процессе работы создают и используют какие-то свойства обьекта, стоит ли эти свойства описывать при конструировании изначально чтобы наглядно показывать что эти свойства как бы ЗАНЯТЫ?
/**
* Dummy (пустышка) Каркас для обьектов на карте.
* Дамми умеет перемещаться, имеет позицию, скорость и.т.п.
* От этого класса наследуют все юниты, их пули, в общем все что есть на карте.
* @constructor
---------------------------------------------------------------------------------*/
function Dummy() {
this.position = new Position;
/*ВОТ ТУТ СТОИТ ЛИ ИХ ПИСАТЬ для наглядности?*/
this.isMoving = null;
this.startTime = null;
this.targetPosition = null;
}
Dummy.prototype.getPosition = function () {
return this.position
};
Dummy.prototype.moveTo = function (targetPosition) {
this.isMoving = true;
this.startTime = new Date;
this.targetPosition = targetPosition;
};
ведь null для этого и создан, чтобы определять предполагаемый обьект. это некая временная заглушка (чтобы запрос не поднимался дальше по цепочке прототипов видимо и не только). но в таком случае тип предполагаемого обьекта становится не очевидным..... неужели придется писать рядом с каждым таким свойством jsdoc? или смириться с тем что яваскрипт не строго типизированный и если нужны типы то переходить на typescript и.т.п. ? короче ЧАДНТ? |
Я описываю все возможное свойства в prototype объекта ( = null) и снабжаю JSDoc.
|
чтобы ускорить создание объектов)?
предполагается что я буду наследовать некоторые клаcсы от других вот так Unit.prototype = new Dummy; Unit.prototype.constructor = Unit; ты предлагаешь после этой записи перечислять свойства? а вообще логично ли это? не считаешь ли ты что свойства они персональные для каждого обьекта по этому логичнее писать их в конструктор а методы пихать в прототип? не считаешь ли ты что методы, не найдя свойство в обьекте, потянутся искать его в прототипе (пока не переопределят конечно) и это еще более замедлит работу чем "долгая" инициализация? К тому же уверен ли ты что создатели движков не сделали оптимизации и больше не нужно пихать методы в прототип? (щас кстати это и проверим) |
Скорость создания объектов тут не причём, это для параноиков :)
Просто не люблю я захламлять конструктор, а когда оформляю в прототип, то всё выглядит очень аккуратно.
var Select = new Class(function () {
// Конструктор
}, {
/**
* Свойство
*
* @type {?string}
*/
myProp: null
}, Input /* Родительский класс */);
var select = new Select();
PS: про поиск методов тоже глупость, я отталкиваюсь от реального опыта, а не от абстрактных статей людей не использующих ООП в JS, кароче всё норм) |
ненене покажи пример на нативном js просто устраиваюсь на работу хочу красиво нативно писать.
п.с. оптимизаций не сделали, придется пихать методы по старинке в прототип) |
Дык тут всё нативно, т.к.
function Class(construct, opt_params, opt_parent) {
opt_params = opt_params || {};
construct.base = opt_parent || null;
if (!opt_parent) {
Object.extend(true, construct.prototype, opt_params);
} else {
Object.extend(true,
construct.prototype,
Function.isFunction(opt_parent) ? opt_parent.prototype : opt_parent, opt_params
);
construct.prototype.base = opt_parent;
}
return construct;
}
Ну, а если совсем просто, то:
function Select() {
}
Object.extend(true, Select.prototype, {
myProp: null
});
PS: Object.extend это реализация подмешивания, аналог jQuery.extend |
Цитата:
Цитата:
|
и вопрос, ка ты вот это в прототип пихнешь?
this.position = new Position; Цитата:
Цитата:
|
Цитата:
2) Ну если совсем нативно, то простое перечисление: prototype.свойство 3) По личному опыту скажу, что в играх тормоза не там :) К слову типизированные массивы в JS добавили не с проста) |
Цитата:
Цитата:
|
Если я правильно понял твой вопрос, то так.
function Animal() {
...
...
this.life = new Life();
};
/**
* Объект жизни
*
* @type {Life}
*/
Animal.prototype.life = null;
/**
* Убить животное
*/
Animal.prototype.die = function () {
...
};
Т.е. в прототип я просто декларирую сам факт существования свойства, а не его значение (если конечно таковое не требуется). Такой подход имхо удобен для чтения, а также дополнительный профит, что нормальная ИДЕ лучше автокомплитит по коду. 2) Какую статью? Я просто пробывал писать игрульки в своё время, 2-мерные, аля марио и т.д. и у меня как раз тормоза были на массивах препятствий и монстриков, после того как перешёл на типизированные, то всё исправилось, но на статью ссылку дай :) |
|
Цитата:
|
а наследование ты делаешь так?
/* Животинка
----------------------------------------------------*/
function Animal() {
this.childerns = [];
this.isWalk = null;
}
Animal.prototype.go = function () {
alert('i going!')
};
/* Кошечка
----------------------------------------------------*/
function Cat() {
this.position = new Position;
this.age = null;
this.name = null;
}
/*наследует от животинки*/
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;
Cat.prototype.sayMew = function () {
alert('mew')
};
|
Да
|
а сделай тройное наследование? с расширением к родительских методов.
|
Без проблем, но напишу завтра) уехал из дома, а с телефона не удобно
|
ну я бы сделал его так
/* Боженька
----------------------------------------------------*/
function God() {
this.go = function () {
alert('i GOD');
}
}
/* Животинка
----------------------------------------------------*/
function Animal() {
this.childerns = [];
this.isWalk = null;
this.go = function () {
Animal.prototype.go.call(this);
alert('i going! cuz i animal')
};
}
/*наследует от боженьки*/
Animal.prototype = new God;
/* Кошечка
----------------------------------------------------*/
function Cat() {
this.position = new Array();
this.age = null;
this.name = null;
this.sayMew = function () {
alert('mew')
};
this.go = function () {
Cat.prototype.go.call(this);
alert('and JUMP!! cuz i CAT')
};
}
/*наследует от животинки*/
Cat.prototype = new Animal();
new Cat().go();
|
Ну да, только я бы декларировал методы в прототип ну и создал бы у дочернего объекта ссылку на родительский, чтобы удобней делать расширение родительского метода.
ЗЫ: я стал дядей, грац меня :) |
твой брат родил или сестра)?
|
class Animal {
animal = 'animal';
say() {
alert('i animal')
}
}
class Cat extends Animal {
cat = 'cat';
say() {
super.say();
alert('and i cat')
}
}
new Cat().say();
а получается так
var __extends = this.__extends || function (d, b) {
function __() { this.constructor = d; }
__.prototype = b.prototype;
d.prototype = new __();
};
var Animal = (function () {
function Animal() {
this.animal = 'animal';
}
Animal.prototype.say = function () {
alert('i animal');
};
return Animal;
})();
var Cat = (function (_super) {
__extends(Cat, _super);
function Cat() {
_super.apply(this, arguments);
this.cat = 'cat';
}
Cat.prototype.say = function () {
_super.prototype.say.call(this);
alert('and i cat');
};
return Cat;
})(Animal);
new Cat().say();
//@ sourceMappingURL=td.js.map
|
Цитата:
|
охуенно, а сколько вам лет )?
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Кстати поиграйся с Coffee, он ппц сахарный, куда более сахарнее, чем TypeScript. Рекомендую прочитать Марк Бейтс Coffee Script. |
меня бесит синтаксис кофя... он пиздец какой неочевидный это факт.
ну как я понял typescript его суть именно в проверке типов перед компиляцией и все, а строгая типизация позволяет движкам компилить более быстрый байткод... а в ECMA6 такое есть?
functionm test (lol:string, qq:Cat){
}
|
Цитата:
Цитата:
В новом стандарте JS вроде как должны появится способы проверки входных параметров функций, но не более того. |
var Animal = function () {
this.animal = 'animal';
};
Animal.prototype.say = function () {
alert('i animal');
};
var Cat = function () {
Animal.apply(this, arguments);
this.cat = 'cat';
}
Cat.prototype = Object.create(Animal.prototype, {
constructor: {value: Cat, writable: true, enumerable: false, configurable: true}
});
Cat.prototype.say = function () {
Animal.prototype.say.call(this);
alert('and i cat');
};
new Cat().say();
То есть на сегодняшний день этот код должен примерно так выглядеть? |
Цитата:
на самом деле яваскрипт задумывался для написания скриптов не больше 100 строк кода) так что нечего тут удивляться) |
Цитата:
и это только из-за автокомплита в ide /** * шамансkий JSDOC */ dummy.prototype.isMoving = false; |
я короче чо то вообще попробовав тайпскрипт больше не могу ни на чем другом писать..... это шикарно же. с этим на работу берут?
|
Цитата:
|
игры например где без нормального наследования ни как, и как раз сиподобный типизированный код работает быстрее..
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Цитата:
Цитата:
|
Цитата:
|
| Часовой пояс GMT +3, время: 19:41. |