Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Не понятное поведение создаваемого объекта (https://javascript.ru/forum/misc/52182-ne-ponyatnoe-povedenie-sozdavaemogo-obekta.html)

borodatych 07.12.2014 10:02

Не понятное поведение создаваемого объекта
 
Доброго времени суток.

Возможно не правильно выбран подход...

В общем, код:
var Offline = function(){

    this._inst = false;
    this.version = false;
    this.url  = false;
    this.test = "31234wfs";

    this.Instance = function(){
        if( this._inst ) return this._inst;
        return this._inst = new this;
    };

    this.getUrl = function(url){
        switch( this.version ){
            case "02":
                this.url = url;
                break;
            default: this.url = url;
        }
        return this.url;
    };

    this.getLink = function( url, ankor ){
        var dom,
            //href = this.getUrl(url)
            href = url
        ;
        if( href ){
            dom = "<a href='"+ href +"'>"+ ankor +"</a>";
        }
        else{
            dom = "<span>"+ ankor +"</span>";
        }
        return dom;
    };

};



Ожидания не оправдались...
Вот что в удалось вытянуть:

console.log( Offline );
function (){

    this._inst = false;
    this.version = false;
    this.url  = false;
    this.test = "31234wfs";

    this.Instance = function(){
        if( this._inst ) return this._inst;
        return this._inst = new this;
    };

    this.getUrl = function(url){
        switch( this.version ){
            case "02":
                this.url = url;
                break;
            default: this.url = url;
        }
        return this.url;
    };

    this.getLink = function( url, ankor ){
        var dom,
            //href = this.getUrl(url)
            href = url
        ;
        if( href ){
            dom = "<a href='"+ href +"'>"+ ankor +"</a>";
        }
        else{
            dom = "<span>"+ ankor +"</span>";
        }
        return dom;
    };

}


console.log( Offline.test );
undefined


console.log( Offline.Instance.test );
Uncaught TypeError: Cannot read property 'test' of undefined


Где допустил ошибку? ..вроде все логично..

danik.js 07.12.2014 10:06

Цитата:

Сообщение от borodatych
Где допустил ошибку? ..вроде все логично..

Объясни логику, которую ты тут видишь. Поподробней.

borodatych 07.12.2014 10:43

Я должен работать с Offline как с объектом.

Код написан по аналогии работающего примера, возможно я не все захватил с того примера, но не знаю что, вот и просил

danik.js 07.12.2014 11:24

Цитата:

Сообщение от borodatych
Я должен работать с Offline как с объектом.

Ну так работай. В javascript функция является объектом.

danik.js 07.12.2014 11:25

Задай конкретный вопрос что ты не можешь понять.

borodatych 07.12.2014 11:50

Offline.test должно вернуть 31234wfs, а не undefined
Почему же оно возвращает undefined?

danik.js 07.12.2014 12:17

Цитата:

Сообщение от borodatych
Offline.test должно вернуть 31234wfs, а не undefined

Не должно. С чего бы. Вот твой пример, упрощенный:

function Apple() {
    this.color = 'green';
}

Apple.color // undefined
var apple = new Apple();
apple.color // green


Ты не понимаешь почему так происходит - бегом учить основы. Что такое функция, что такое конструктор и т.д.

borodatych 07.12.2014 12:38

Я просто запутался...

Вот это:
var Instance = function() {
    if (this._instance) return this._instance;
    return this._instance = new this;
};

var Apple = function(){
    this.color = "green";
};

Apple.Instance = Instance;

Apple.Instance.color


Должно же отдать green, а не undefined ??!

danik.js 07.12.2014 12:41

Иди читай что такое функция.

danik.js 07.12.2014 12:42

И как ее вызвать. Где у тебя вызов функции Instance?

danik.js 07.12.2014 12:43

У тебя Instance - функция, так? То есть подпрограмма.
Где в коде у тебя переход к исполнению подпрограммы?

Romaboy 07.12.2014 12:45

var Instance = function() {
    if (this._instance) return this._instance;
    return this._instance = new this;
};

Это функция, такая штуковина, котрая выполняет участок кода.
var Apple = function(){
this.color = "green";
};

Это тоже функция, которая выполняет код, а не содержит цвет.
Apple = {
  this.color: 'green'
}

Вот так и будет работать, только function убрать

danik.js 07.12.2014 12:45

Цитата:

Сообщение от borodatych
Apple.Instance.color


Должно же отдать green, а не undefined ??!

Ты походу еще и наркоман. Каким боком, у объекта, возьмется свойство, объявляемое вообще в другой функции? И причем объявляемое только при вызове этой функции и определяемое на контексте вызвова (this)?

borodatych 07.12.2014 12:58

Цитата:

Сообщение от danik.js
Где у тебя вызов функции Instance?

Премного благодарен, вот она моя рассеяность...

Apple.Instance().color


Цитата:

Сообщение от danik.js
Иди читай что такое функция.

Грубовато, как со школьником, но все равно признателен.

borodatych 07.12.2014 13:06

Про вторую то страницу и не заметил...

Цитата:

Сообщение от danik.js
Ты походу еще и наркоман.

Не угадали.

Цитата:

Сообщение от Romaboy
Вот так и будет работать, только function убрать

И вам спасибо за ответ.
Ваш вариант тоже имеет место быть, но мне было интересно почему мой не работал, мне он как то ближе

danik.js 07.12.2014 13:51

Цитата:

Сообщение от borodatych
Цитата:

Сообщение от danik.js
Ты походу еще и наркоман.

Не угадали.

Посыпаю голову пеплом :cray:
Цитата:

Сообщение от borodatych
вот она моя рассеяность

Теперь все прояснилось? Остался только вопрос - нахрена вся эта шняга? Чего пытаешься добиться этим извратом?

borodatych 07.12.2014 15:22

Добиваюсь подобия ООП.

В итоге:
var Offline = function(){

    this.version = false;
    this.url  = false;

    this.getUrl = function(url){
        switch( this.version ){
            case "02":
                this.url = url;
                break;
            //default: this.url = url;
        }
        return this.url;
    };

    this.getLink = function( url, ankor ){
        var dom,href = this.getUrl(url);
        if( href ){
            dom = "<a href='"+ href +"'>"+ ankor +"</a>";
        }
        else{
            dom = "<span>"+ ankor +"</span>";
        }
        return dom;
    };

};

Offline.Instance = Instance;
Offline.Instance().version  = GetParameter("version");


Instance и GetParameter реализованы в базовом файле.

В процессе:
var offline = '<?=$offline?>';
...
if( offline ){
    var url = offline+"&number="+num+"&detail="+detail;
    detAnalog += "<div id='"+ num +"'>"+ Offline.Instance().getLink( url, num ) +"</div>";
}else ...

danik.js 07.12.2014 21:12

То есть получается что тебе и не нужно чтобы Offline был функцией, так?
var Offline = {
    version: GetParameter("version"),
 
    getUrl: function(url){
        switch( this.version ){
            case "02":
                this.url = url;
                break;
            default: this.url = url;
        }
        return this.url;
    },
 
    getLink: function( url, ankor ){
        var dom,href = this.getUrl(url);
        if( href ){
            dom = "<a href='"+ href +"'>"+ ankor +"</a>";
        }
        else{
            dom = "<span>"+ ankor +"</span>";
        }
        return dom;
    }

};

Offline.getLink();


Возможно название объекта лучше написать с маленькой буквы. Хотя допустим встроенный объект Math пишут же с большой.
Непонятно только че делает getUrl. Полагаю что какую-то ненужную хуйню и его нужно выпилить.
Не ankor а anchor. Имена функций надо с маленькой буквы писать.

borodatych 08.12.2014 16:25

Цитата:

Не ankor а anchor
Благодарю за внимательность, с русским плохо.

Цитата:

Непонятно только че делает getUrl. Полагаю что какую-то ненужную хуйню и его нужно выпилить.
Тут я забыл закоментировать/удалить, поправил.

Цитата:

Имена функций надо с маленькой буквы писать.
Прислушался..

Цитата:

То есть получается что тебе и не нужно чтобы Offline был функцией, так?
Я тоже пришел к такому варианту, так как IE ругался на:
Offline.Instance = Instance;


danik.js, Вы мне достаточно помогли, вопрос можно закрыть.

Всем спасибо за уделенное внимание.

borodatych 08.12.2014 16:42

Хотя если кто объяснит существенную разницу между

var Offline = function(){

    this.version = false;
    this.url     = false;

    this.getUrl = function(url){
        switch( this.version ){
            case "02":
                this.url = url;
                break;
            //default: this.url = url;
        }
        return this.url;
    };

    this.getLink = function( url, anchor ){
        var dom,href = this.getUrl(url);
        if( href ){
            dom = "<a href='"+ href +"'>"+ anchor +"</a>";
        }
        else{
            dom = "<span>"+ anchor +"</span>";
        }
        return dom;
    };

};


И

var Offline = {

    version : false,
    url     : false,

    getUrl : function(url){
        switch( this.version ){
            case "02":
                this.url = url;
                break;
            //default: this.url = url;
        }
        return this.url;
    },

    getLink : function( url, anchor ){
        var dom,href = this.getUrl(url);
        if( href ){
            dom = "<a href='"+ href +"'>"+ anchor +"</a>";
        }
        else{
            dom = "<span>"+ anchor +"</span>";
        }
        return dom;
    }

};


Буду признателен... Для меня они идентичны.

jsnb 08.12.2014 16:51

Первое - функция-конструктор, с помощью которой можно создавать объекты через new, а второе - объект.

danik.js 08.12.2014 17:12

Вариант с объектом можно записать как:
var Offline = {};
Offline.version = false;

То есть создали объект, затем определили ему свойства. Вместо создания объекта с уже заданным набором свойств.

Так как функция - тоже объект, то ты можешь запросто заменить это на:

var Offline = function() {};
Offline.version = false;

Но какой мысл в этой функции?

borodatych 11.12.2014 18:31

danik.js,
Вы правы, в данной ситуации это излишне.


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