Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   объект не видит метод (https://javascript.ru/forum/misc/43841-obekt-ne-vidit-metod.html)

cyklop_77 23.12.2013 15:09

объект не видит метод
 
помогите пожалуйста понять и по возможности исправить ошибку

на страничке после клика по .one в консоли выводится сообщение
Uncaught ReferenceError: render is not defined


этот метод render() расположен во внешней области видимости вызывающего объекта, а значит должен быть видим

пробовал добавлять метод render() через прототип. результат тот же(

tsigel 23.12.2013 15:32

Цитата:

Сообщение от cyklop_77
render(this, options.x++, options.y++);

это не функция лежащая в глобальной видимости а метод корабля. Причем конкретного. Её нельзя вызвать так как вы это делаете. Её надо вызывать через this.render, причем this должен быть именно тем объектом, которому надо выполнить этот метод :blink:

cyklop_77 23.12.2013 17:25

ну почему же нельзя? создаётся несколько однотипных объектов ко?раблей, а затем observer рассылает сигналы запустить метод move, который есть у каждого корабля...
метод move находится в одной области видимости с методом render. значит может его вызвать.
что я не понимаю?

tsigel 23.12.2013 17:31

если я пишу
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.

tsigel 23.12.2013 17:34

В целях экономии памяти предпочтительно писать методы объекта в прототип. Сейчас у вас у каждого объекта есть свои методы, которые абсолютно одинаковы. Если вы запишете их в прототип, то каждого метода будет по 1, просто все корабли будут на них ссылаться.

nerv_ 24.12.2013 01:02

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 Только на нашем канале

cyklop_77 24.12.2013 10:09

спасибо за вариант. но жуквери здесь только для экономии времени. основная задача сейчас - разобраться с простейшими паттернами на чистом js

nerv_ 24.12.2013 10:33

тогда читай это http://www.books.ru/books/javascript...864682/?show=1


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