2014-08-29 4 views
-1

У меня есть дурацкая ссылочная проблемаJavaScript прототип функции вызов родителя от ребенка

Я объявленная переменное пространство имен под названием MYAPP

var MYAPP = MYAPP || function() { 

    this.name = 'My Application'; 
    this.someImportantID = 123; 

}; 

А потом я хотел Sperate своего кода в пространствах имен/функциях, и поэтому я сделал

MYAPP.prototype.homepage = function() { 
    urls: { 
     linkOne: '/link/to/some/page/', 
     linkTwo: '/link/to/some/page/' 
    }, 
    doSomething: function() { 

     // ajax call 
      $getting = $.get(this.urls.linkOne) 
     // and so on ..... 

     // how can I acces someImportantID ?? 

    } 
} 

тогда я использовать его как это

app = new MYAPP(); 
app.homepage.doSomething(); 

, но как я могу получить доступ к someImportantID в функции DoSomething()

+0

Есть ли причина, по которой вы используете MYAPP в качестве конструктора вместо того, чтобы просто выполнять var var MYAPP = MYAPP || {...} '? – frederickf

+0

Есть ли разница в производительности? – webmaster

ответ

0

избавиться от этого .homepage вещи. Почему вы все так делаете?

Это что-то вроде конструктора. Объявите ваш конструктор:

var MYAPP = function(URLCollection) { 

    this._name = 'My Application'; 
    this._someImportantID = 123; 
    this._URLCollection = URLCollection; 

} 

Затем объявить методы экземпляра:

MYAPP.prototype = { 

    doSomething: function() { 

     // ajax call 
      $getting = $.get(this._URLCollection.linkOne); 

     // and so on ..... 

     // how can I acces someImportantID ?? 

    } 
} 

Затем объявить экземпляр переходящая в вашей коллекции ссылок:

var lCollection = { linkOne: 'URL', linkTwo: 'URL' }; 
var myHomePage = new MYAPP(lCollection); 

Вы можете получить доступ к DoSomething из экземпляра:

myHomePage.doSomething(); 

Вы можете добраться до какого-то важного ID из экземпляра также:

myHomePage._someImportantId; 

Или изнутри, например, путем:

this._someImportantId; 

Это грубо - он должен направить вас в правильном направлении.

+0

Да, я знаю, но у меня есть много других страниц, таких как домашняя страница. И у каждой страницы есть свои (разные) функции, я хочу разделить их в разных файлах, в противном случае это очень длинный файл – webmaster

+0

. Я думаю, что я и некоторые другие выбрасываются из вашего использования конструктора. Зачем следовать шаблону конструктора, когда вам действительно нужны отдельные модули? Я рекомендую вам искать книгу Addy Osmani 'Javascript Design Patterns' и дать ей прочитать. Вы можете найти копию здесь: http: // addyosmani.com/resources/essentialjsdesignpatterns/book/ –

+0

да спасибо за ссылку, я изменил функцию myapp на объект, затем я создал такие модули, myapp.homepage.doSomething(), myapp.otherpage.doSomething(), this это то, что я хотел, спасибо всем – webmaster

0

Если существует несколько экземпляров MYAPP, то вы можете сделать следующее:

//IIFE creating it's own scope, HomePage constructor 
// is no longer globally available 
;(function(){ 
    var HomePage = function(urls,app){ 
    this.urls=urls; 
    this.app=app; 
    } 
    HomePage.prototype.doSomething=function(){ 
    console.log('urls:',this.urls,'app:',this.app); 
    } 
    //assuming window is the global 
    window.MyApp = function(urls){ 
    this.name='app name'; 
    this.homePage=new HomePage(urls,this); 
    } 
}()); 
var app = new MyApp(['url one','url two']); 
app.homePage.doSomething(); 

Если у вас есть только одно приложение, и это приложение имеет только один объект сайте вы можете сделать это следующим образом, а также:

var app = { 
    name:'app name' 
    ,homePage:{ 
    urls:['url one','url two'] 
    ,doSomething:function(){ 
     console.log('urls:',this.urls,'app:',app); 
     //or 
     console.log('urls:',app.homePage.urls,'app:',app); 
    } 
    } 
} 

app.homePage.doSomething(); 

Подробнее о конструкторских функциях, прототипе и его значении here.

+0

Я вижу, как вы передаете это на главную страницу, но как я могу раскрыть домашнюю страницу в области myapp, она не должна быть глобальной переменной – webmaster

+0

Существует только одна глобальная переменная MYAPP – webmaster

+0

@webmaster Я спросил, существует более одного экземпляра, а не если у вас есть только одна функция-конструктор. Существует разница (см. Ссылку в конце ответа). Я использовал различную капитализацию, потому что все шапки - это соглашение для констант. Я отредактировал свой ответ, чтобы иметь конструктор главной страницы, доступный только в конструкторе MyApp. – HMR

Смежные вопросы