Редактировать: Причина, по которой глобальные переменные не поощряются в js, заключается в том, что весь код имеет одно глобальное пространство имен, где javascript автоматически подразумевает глобальные переменные (например, переменные, которые явно не объявлены в локальной области видимости, являются автоматически добавляется в глобальное пространство имен). Полагая слишком много на глобальные переменные , можно привести к некоторым конфликтам между скриптами на одной странице. Это не значит, что вы не должны использовать глобальные переменные, но вы не должны использовать их легкомысленно. Если вам нужно, чтобы переменная была доступна после завершения функции, ваш выбор ограничен, поэтому либо используйте глобальную переменную, либо передайте переменную той функции, в которой вы нуждаетесь.
Вам просто нужно сохранить результат doStuff и затем получить доступ к этой переменной в addArray:
var result
function doStuff() {
//document.write("We are testing document writing now!");
let numArray;
let sumArray;
let start = parseInt(prompt("Enter a small number"));
let end = parseInt(prompt("Enter a larger number"));
if (start > end) {
alert("Error: first int greater than last!")
} else {
let arraySize = end - start;
numArray = [start];
for (let x = start + 1; x <= end; ++x) {
numArray.push(x);
}
result = numArray; // save result for later (has to be a global scope)
}
}
function addArray() { // you defined this without an input in your form, so stick to that
if (result) // check if value exists
console.log(result);
else
console.log("Please enter the numbers boundaries first first.");
}
<form>
<input type="button" value="Click Me to generate an array of numbers!" onclick="doStuff()" />
<input type="button" value="Click me to add the array numbers" onclick="addArray()" />
</form>
Вы можете использовать шаблон стратегии или что-то подобное для использования используется (композиция) вместо , это (наследование):
public class TypeA : CustomButtonUserControl, IMagician {
IMagician magicObj = new Magical();
public void DoMagic() {
magicObj.DoMagic();
}
}
public class TypeB : CustomButtonUserControl, IMagician {
IMagician magicObj = new Magical();
public void DoMagic() {
magicObj.DoMagic();
}
}
public class Magical : IMagician {
public void DoMagic() {
// shared magic
}
}
Есть и другие способы создания экземпляров ваших частных членов IMagician (например, передача их в качестве параметра через конструктор), но приведенное выше должно помочь вам начать работу.
DoMagic
работает со многими частными пользователями. Можете ли вы упаковать эти закрытые переменные internal
? Таким образом, метод расширения может получить к ним доступ. Если ничто не кажется особенно хорошим, выберите то, что вам больше всего нравится, используйте его пару раз и переставьте завтра. :) [1 110]
В этом случае ваша кишка верна. Шаблон Adapter - это то, что вы ищете.
У DoFactory есть хорошие примеры .NET (которые также должны быть очень близки к их Java-аналогам):
public interface IMagician{ /* declare here all the getter/setter methods that you need; they will be implemented both in TypeA and TypeB, right? */ }
public static class MyExtensions {
public static void doMagic(this IMagician obj)
{
// do your magic here
}
}
Теперь, проблема в том, что если вам ДЕЙСТВИТЕЛЬНО нужно использовать частные свойства / методы (в отличие от «внутренних»), этот подход не будет работать. Ну, на самом деле, вы можете творить чудеса, если сможете прочитать эти свойства с помощью отражения, но даже если это работает, это довольно уродливое решение:)
[Обратите внимание, что «doMagic» автоматически появится станьте частью TypeA и TypeB просто потому, что вы внедрили IMagician - нет необходимости иметь там какую-либо реализацию]
Заменить наследование композицией.
Переместите общую функцию в отдельный класс, создайте экземпляр этого класса и вставьте его в объект TypeA и в объект TypeB.
Составной шаблон предназначен для сложных объектов, это означает, что основное внимание уделяется одному объекту, состоящему из других объектов. Шаблон стратегии можно рассматривать как частный случай этого, но стратегия не обязательно должна быть объектом. Я думаю, это больше относится к вашему случаю. Опять же, это сильно зависит от характера того, что делает DoMagic ()
.
abstract class Magical: CustomButtonUserControl
{
public void DoMagic()
{
// ...
}
}
public class TypeA : Magical
{
}
public class TypeB : Magical
{
}
Вы можете использовать композицию, чтобы иметь мага как свойство типа A и типа B
class Magician : IMagician
{
public void DoMagic()
{}
}
Class TypeA : CustomButtonUserControl
{
//property
Magician magicianInTypeA
}
Class TypeB : CustomTextUserControl
{
//property
Magician magicianInTypeB
}