2015-11-04 3 views
1

У меня есть вопрос о JavaScript. Я знаю, как использовать прототип, и почему она используется, но я попытался ответить мне на этот вопрос, что произойдет, если я использую прототип функции, как это,Javascript/Prototype

var Command = function() { 
    var text = 'Hello World'; 

    Command.prototype.run = function() { 
     console.log(text); 
    }; 
}; 

var command = new Command(); 
command.run(); 

Теперь я буду иметь возможность использовать также частные функции или переменные. У меня есть сборка с примерами jsFiddle со всеми вариантами, и это показывает, что нет никакой разницы, где я использовал прототип. Но могу ли я что-то перекрыть?

+0

Я действительно не понимаю ваш вопрос - работает ли ваш код? – messerbill

+0

Да, это работает, мой вопрос в том, есть ли проблема использования прототипа в функции, а также ссылки на эти темы, используемые прототипом вне основной функции. – nirgendswo

+0

@nirgendswo: Нет, это ** не работает **. Попытайтесь использовать его с несколькими экземплярами и увидите, что он сбой. – Bergi

ответ

-1

VAR test закрывается функцией выражения Command.prototype.run. Это называется замыканием.

var Command = function() { 
    var text = 'Hello World'; 

    Command.prototype.run = function() { // text is closed over by this function 
     console.log(text); 
    }; 
}; 
Command.prototype.run1 = function() { // text is not in scope and thus not available. 
    console.log(text); 
}; 

var command = new Command(); 
command.run(); // this will work and display what is in text 
command.run1(); // this will fail and throw text undefined error. 

Обычно, если переменная находится в области, где вы определяете функцию, она будет доступна для этой функции. Если нет, то у вас нет доступа к нему.

+0

Я знаю, но мой вопрос, есть ли какие-либо проблемы с использованием прототипа в функции. Все ссылки на эту тему использовали прототип вне основной функции. – nirgendswo

-1

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

var Command = function() { 
    var text = 'Hello World'; 

    //One time create this function 
    Command.prototype.run = function() { 
     console.log(text); 
    }; 

    this.test= function(){ 
     console.log(text); 
    } 
}; 

var command = new Command(); //again created test function, because it doesn't have a prototype 
command.run(); 
command.test(); 
+0

Я знаю, но мой вопрос, есть ли какие-либо проблемы с использованием прототипа в функции. Все ссылки на эту тему использовали прототип вне основной функции. – nirgendswo

+1

@nirgendswo Нет проблем. Но если прототип внутри функции, прототип переопределяется каждый раз, когда вы создаете новый объект Command. Если вы создадите его только один раз, это не имеет значения. Если вы создаете многие из них, то это будет иметь значение, но маргинальное. Если вы делаете миллионы из них, избегайте этого. – Blindman67

+0

@ Blindman67 поэтому из вашего комментария выше вашей тестовой функции, равной запуску fucntion несколькими способами. Функция тестирования также создается, когда мы пытаемся создать новый объект.Правильно ли это? А также функция -run_, которую вы всегда переопределяете, я прав? –

1

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

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

Вот почему вы не увидите, как другие люди это делают. Определение run() вне вашей функции на прототипе определяет ее один раз. Это идиоматический JS, например. MDN.

Я не знаю никаких технических проблем с этим.

+0

Как в стороне, я могу понять, почему было бы более естественным определять функцию так, как у вас есть - классы ES6 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes дают вам синтаксический сахар над прототипом механизма для более классического ощущения OO. – Brabster

+0

Это основная причина, более подробная структура и использование частных функций и параметров. ES6 отлично, но не подходит для каждого проекта ;-) – nirgendswo

+0

ah .. ok - когда вы добавляете что-то в прототип, оно не является частным, где бы оно ни было. Определение вещей в закрытии, как правило, заключается в том, как вы получаете конфиденциальность в JS. – Brabster