Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.12.2013, 15:09
Аспирант
Отправить личное сообщение для cyklop_77 Посмотреть профиль Найти все сообщения от cyklop_77
 
Регистрация: 01.09.2013
Сообщений: 33

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

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


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

пробовал добавлять метод render() через прототип. результат тот же(
Ответить с цитированием
  #2 (permalink)  
Старый 23.12.2013, 15:32
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Сообщение от cyklop_77
render(this, options.x++, options.y++);
это не функция лежащая в глобальной видимости а метод корабля. Причем конкретного. Её нельзя вызвать так как вы это делаете. Её надо вызывать через this.render, причем this должен быть именно тем объектом, которому надо выполнить этот метод
Ответить с цитированием
  #3 (permalink)  
Старый 23.12.2013, 17:25
Аспирант
Отправить личное сообщение для cyklop_77 Посмотреть профиль Найти все сообщения от cyklop_77
 
Регистрация: 01.09.2013
Сообщений: 33

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

Последний раз редактировалось cyklop_77, 23.12.2013 в 17:27.
Ответить с цитированием
  #4 (permalink)  
Старый 23.12.2013, 17:31
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

если я пишу
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:39.
Ответить с цитированием
  #5 (permalink)  
Старый 23.12.2013, 17:34
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

В целях экономии памяти предпочтительно писать методы объекта в прототип. Сейчас у вас у каждого объекта есть свои методы, которые абсолютно одинаковы. Если вы запишете их в прототип, то каждого метода будет по 1, просто все корабли будут на них ссылаться.
Ответить с цитированием
  #6 (permalink)  
Старый 24.12.2013, 01:02
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

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


вечера раскрытия тайн Только на нашем канале
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 24.12.2013 в 01:06.
Ответить с цитированием
  #7 (permalink)  
Старый 24.12.2013, 10:09
Аспирант
Отправить личное сообщение для cyklop_77 Посмотреть профиль Найти все сообщения от cyklop_77
 
Регистрация: 01.09.2013
Сообщений: 33

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

Последний раз редактировалось cyklop_77, 24.12.2013 в 10:22.
Ответить с цитированием
  #8 (permalink)  
Старый 24.12.2013, 10:33
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

тогда читай это http://www.books.ru/books/javascript...864682/?show=1
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
button onClick объект не поддерживает это свойство или метод dimarus83 Events/DOM/Window 8 01.03.2014 15:41
Image.onload: Объект не поддерживает это свойство или метод Ichigeki Internet Explorer 2 06.07.2011 21:11
Объект не поддерживает это свойство или метод load_081112_0953.js 1auto1 Общие вопросы Javascript 1 13.04.2011 22:09
Объект не поддерживает это свойство или метод load_081112_0953.js 1auto1 Internet Explorer 1 13.04.2011 21:59
1. Календарь 2. объект String метод getEMail Мандариновая Общие вопросы Javascript 8 31.10.2008 11:33