объект не видит метод
помогите пожалуйста понять и по возможности исправить ошибку
на страничке после клика по .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, время: 18:49. |