2013-03-03 3 views
0

Я пытаюсь получить действительно прочное понимание JavaScript, и я спотыкаюсь о большой проблеме для меня. Я привык работать на языках C, и один из барьеров, которые я нахожу, касается функциональности прототипа JavaScript и когда функции объявлены, поскольку это касается порядка выполнения.Использование прототипа и выполнение порядка выполнения

Например, возьмем следующий код:

var construct = new Constructor(); //I can do this even if its above the declaration of the object. 

construct.MyPrivilagedFunction(); //Can do this here too, even though it's above the function declaration. 

construct.MyPublicFunction(); //Can't do this because it is above the function declaration. 

function Constructor() { 

    //Private member 
    var m_Ding = "Ding!"; 

    //Accessible publicly and has access to private member. 
    this.MyPrivilagedFunction = function() { 
    console.log(m_Ding); 
    } 
} 
Constuctor.prototype.MyPublicFunction = function() { 
    //Doesn't have access to private members. This doesn't work. 
    console.log(m_Ding); 
} 

Я понимаю, что прототипирования обеспечивает более высокую производительность, потому что тогда копия функции не хранится на каждом экземпляре вашего объекта и вместо того, чтобы каждый экземпляр имеет в виду (и, я думаю, каждый новый экземпляр можно считать целым новым типом объекта?). Однако прототипирование не позволяет мне использовать функцию до ее определения. Кроме того, прототипированная функция не имеет доступа к частному члену объекта.

Это действительно проблема, потому что я работаю над проектом, где два объекта должны будут использовать функции друг друга. Если я поместил один объект ранее в код, у него не будет доступа ко второму объекту, потому что прототипированные функции будут соответствовать порядку выполнения (сверху вниз).

Боковое примечание: Я также знаю, что мой объект должен быть объектным литералом (например, object = {property: value}), но я все еще пытаюсь получить четкое представление о сфере видимости и прототипировании, чтобы попытаться с этим на данный момент.

+0

что у меня вопрос непонятно. – 2013-03-03 10:04:00

ответ

0

Если я вас устрою, корень вашей проблемы - «два объекта должны будут использовать функции друг друга».

Но на самом деле Javascript не является типизированным языком: define TypeA, define TypeB, после этого вы можете использовать экземпляры: typeA и typeB объекты без проблем.

var Speaker = function(name) { 
    this.name = name ; 
}; 

Speaker.prototype.sayHi = function(aMate) { 
    amate.listenTo(this, ' Hi ' + this.mate.name); // no type checking performed here 
                // so no issue even if Listener 
                // is not defined yet 
}; 

var Listener = function(name) { 
    this.name = name; 
    this.knownMate = []; 
}; 

Listener.prototype.listenTo = function (mate, words) { 
    this.knownMate.push(mate); 
}; 

var aSpeaker = new Speaker('Joe'); 
var aListener = new Listener('Bobby'); 

aSpeaker.sayHi(aListener); 

И, кстати, у вас нет закрытых членов в Javascript, только закрытие. Так что да, любая функция, определенная вне области «частного» члена, будет не сможет читать/писать на нее.
Следует также иметь в виду, что если производительность является проблемой, затворы работают медленнее на менее мощный двигатель js. А, не столь плохое решение иметь «псевдо-частного» члены состоит в определении тех членов не перечислимы с Object.defineProperty()
(смотреть здесь:
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty)

0

Порядок выполнения является тот, который вы пишете. Есть только два исключения из правила: «все ниже не имеет значения»: объявления переменной и функции поднимаются, т. Е. Вы можете использовать (назначать, вызывать) выше. И остерегайтесь difference between function declarations and function expressions.

var construct = new Constructor() //I can do this even if its above the declaration of the object.

Декларация функции конструктора вы хотите сказать.

construct.MyPrivilagedFunction(); //Can do this here too, even though it's above the function declaration.

Там нет объявление функции здесь.При выполнении функции конструктора (см. Выше) был создан привилегированный метод (с назначением выражения функции для свойства).

construct.MyPublicFunction(); //Can't do this because it is above the function declaration.

Опять же, это не объявление функции, но уступка выражения функции. И это еще не произошло, потому что это ниже.

Это действительно проблема, потому что я работаю над проектом, где два объекта должны будут использовать функции друг друга. Если я поместил один объект ранее в код, у него не будет доступа ко второму объекту, потому что прототипированные функции будут соответствовать порядку выполнения (сверху вниз).

Обычно вам не нужен доступ ко всему, прежде чем вы что-либо назовете. Сначала «Объявите» все (конструктор, свойства прототипа), а затем создайте экземпляр.

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