объект не видит метод
помогите пожалуйста понять и по возможности исправить ошибку
на страничке после клика по .one в консоли выводится сообщение Uncaught ReferenceError: render is not defined этот метод render() расположен во внешней области видимости вызывающего объекта, а значит должен быть видим пробовал добавлять метод render() через прототип. результат тот же( |
Цитата:
|
ну почему же нельзя? создаётся несколько однотипных объектов ко?раблей, а затем observer рассылает сигналы запустить метод move, который есть у каждого корабля...
метод move находится в одной области видимости с методом render. значит может его вызвать. что я не понимаю? |
если я пишу
var a = {
test: function () {
}
}
то я должен вызвать тест не как test(), а как a.test(); Вы объявляете:
this.render = function (obj, x, y){
$(obj).css({
'left': x,
'top': y
});
};
Вы вызываете:
this.move = function(e){
//console.log(options.x + '___' + options.y + '__' + e.message);
console.log(110);
render(this, options.x++, options.y++);
};
как надо:
var ship = this;
this.move = function(e){
//console.log(options.x + '___' + options.y + '__' + e.message);
console.log(110);
ship.render(ship, options.x++, options.y++);
};
render это функция, которая лежит в объекте ship под ключем render. |
В целях экономии памяти предпочтительно писать методы объекта в прототип. Сейчас у вас у каждого объекта есть свои методы, которые абсолютно одинаковы. Если вы запишете их в прототип, то каждого метода будет по 1, просто все корабли будут на них ссылаться.
|
cyklop_77, открою тебе страшную тайну: если используешь жуквери, портянку вида
//- observer
var observerable = {
listeners: {},
addListener: function (object, evt, callback) {
if (!this.listeners.hasOwnProperty(evt)) {
this.listeners[evt] = [];
}
this.listeners[evt].push(object[callback]);
},
removeListener: function (object, evt, callback) {
if (this.listeners.hasOwnProperty(evt)) {
var i, length;
for (i = 0, length = this.listeners[evt].length; i < length; i += 1) {
if (this.listeners[evt][i] === object[callback]) {
this.listeners[evt].splice(i, 1);
}
}
}
},
publisher: function (evt, args) {
if (this.listeners.hasOwnProperty(evt)){
var i, length;
for (i = 0, length = this.listeners[evt].length; i < length; i += 1){
this.listeners[evt][i](args);
}
}
}
};
можно заменить на что-то такое:
/**
* jQuery Simple App
* @author: nerv
* @version: 0.1.1, 2012-10-26
*/
(function( $, window ) {
'use strict';
if ( '$app' in window ) {
return;
}
var slice = Array.prototype.slice;
var observer = $({});
window.$app = {
on: function() {
observer.on.apply( observer, arguments );
return this;
},
off: function() {
observer.off.apply( observer, arguments );
return this;
},
trigger: function() {
observer.trigger( arguments[ 0 ], slice.call( arguments, 1 ) );
return this;
},
ready: function() {
$( arguments[ 0 ] );
return this;
}
};
}( jQuery, window ));
юзать так:
// dom ready
$app.ready(function() {
});
$app.on('event', function() {});
$app.trigger('event', 1, 2, 3);
вечера раскрытия тайн :D Только на нашем канале |
спасибо за вариант. но жуквери здесь только для экономии времени. основная задача сейчас - разобраться с простейшими паттернами на чистом js
|
тогда читай это http://www.books.ru/books/javascript...864682/?show=1
|
| Часовой пояс GMT +3, время: 05:04. |