#javascript #constructor #scope #javascript-objects
#javascript #конструктор #область #javascript-объекты
Вопрос:
<
<button onclick="document.getElementById('test').innerHTML = console.log(coin.test = 10)">run 'coin.test = 10'</button>
<button onclick="document.getElementById('total').innerHTML = console.log(coin.total)">run 'coin.total'</button>
<button onclick="document.getElementById('heads').innerHTML = console.log(coin.heads)">run 'coin.heads'</button>
<p id="test"></p>
<p id="total"></p>
<p id="heads"></p>
<script>
function appendItem(list, item) {
list.push(item);
}
function randomNumber(min, max) {
return Math.floor(Math.random() * (max - min 1)) min;
}
var list = ["last","hi"];
function template(l, o){
var obj = this;
this.list = l;
this.options = o;
Object.defineProperty(this, 'test', {
set: function(numberOfTests) {
for(var i = 0; i < numberOfTests; i ){
appendItem(obj.list, obj.options[randomNumber(0, this.options.length - 1)]);
}
//console.log(obj.list);
return obj.list;
}
});
for(var i = 0; i < obj.options.length; i ){
console.log(i);
Object.defineProperty(obj, obj.options[i], {
value: obj.options[i] ": " (obj.list.filter(function(option){return option == obj.options[i];}))
});
}
Object.defineProperty(obj, 'total', {
get: function() {
var totalList = [];
for (var i = 0; i < obj.options.length; i ){
appendItem(totalList, obj.options[i] ": " (obj.list.filter(function(option){return option == obj.options[i]}).length));
}
return totalList;
}
});
}
var coin = new template([], ["heads", "tails"]);
//var dice = new template([], ["one", "two", "three", "four", "five", "six"]);
coin.test = 10; //returns an array of "heads" and "tails"
//console.log(coin.total);
//console.log(coin.heads);
</script>
«coin.heads» — это то, с чем у меня проблема. вместо того, чтобы регистрировать количество вхождений heads (например: «heads: 4»), он регистрирует «heads: «, и я думаю, что это проблема области видимости, но когда я добавил переменную ‘obj’ (локальную для функции шаблона, также это то, что мой код теперь изначально, это было бывозвращаю undefined или ошибку, но я добавил и использовал ‘obj’, и теперь он регистрирует «heads: «), он все еще не работает. Я перепробовал кучу вещей, и ни одна из них не сработала
Комментарии:
1. Было бы полезно, если бы вы объяснили, чего вы хотите достичь. Большая часть этого кода кажется ненужной. Кроме того,
appendItem
не определено.2.
appendItem
этого не хватает в вашем коде — я попытался превратить его в фрагмент SO (попробуйте, его<>
значок в редакторе вопросов), и это означало, что я не смог его протестировать. Пожалуйста, попробуйте получить весь ваш код во фрагменте. Кроме того, это запутанный способ создания класса — я даже не понимаю, почему вы назначаетеthis
obj
— это делает все намного более запутанным. Или почему ваши переменные называютсяl
ando
, просто назовите ихlist
andoptions
. Делает все более понятным.3. Я добавил ‘obj’, потому что я получал ошибки в некоторых местах, где я использовал ‘this’. также синтаксис немного отличается, потому что я использую code.org что изменило некоторые функции
4. Эй, не волнуйся, это были просто советы. Вам не нужно редактировать это сейчас. Если вы можете запустить свой код в виде фрагмента SO, что должно быть возможно, если вы добавите
appendItem
в код здесь, или макет метода, который генерирует тот же результат, тогда мы увидим. Действительно трудно понять, почему ваш код ничего не печатает, поскольку мы понятия не имеем, какое содержимое нам нужно посмотреть.5. @somethinghere хорошо, я сделал это