Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.07.2018, 11:12
Интересующийся
Отправить личное сообщение для RuBrain Посмотреть профиль Найти все сообщения от RuBrain
 
Регистрация: 20.04.2018
Сообщений: 21

Пример из Флэнагана
Всем привет

Продолжаю ковырять Флэнагана, в книге есть такой пример перечисления:

var Coin = enumeration({Penny: 1, Nickel:5, Dime:10, Quarter:25});
var dime = Coin.Dime;


В переменной dime должен создаваться новый объект, но при запуске скрипта, интерпретатор ругается на функцию enumeration. Подскажите, почему не работает код?
Ответить с цитированием
  #2 (permalink)  
Старый 14.07.2018, 12:21
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

Сообщение от RuBrain
интерпретатор ругается на функцию enumeration
и где сама функция?
Ответить с цитированием
  #3 (permalink)  
Старый 26.07.2018, 13:08
Интересующийся
Отправить личное сообщение для RuBrain Посмотреть профиль Найти все сообщения от RuBrain
 
Регистрация: 20.04.2018
Сообщений: 21

Прошу прощения, мой косяк, чуть ниже было описание функции. Вот весь код:

function enumeration(namesToValues) {
    // This is the dummy constructor function that will be the return value.
    var enumeration = function() { throw "Can't Instantiate Enumerations"; };

    // Enumerated values inherit from this object.
    var proto = enumeration.prototype = {
        constructor: enumeration,                   // Identify type
        toString: function() { return this.name; }, // Return name
        valueOf: function() { return this.value; }, // Return value
        toJSON: function() { return this.name; }    // For serialization
    };

    enumeration.values = [];  // An array of the enumerated value objects

    // Now create the instances of this new type.
    for(name in namesToValues) {         // For each value 
        var e = Object.create(proto);          // Create an object to represent it
        e.name = name;                   // Give it a name
        e.value = namesToValues[name];   // And a value
        enumeration[name] = e;           // Make it a property of constructor
        enumeration.values.push(e);      // And store in the values array
    }
    // A class method for iterating the instances of the class
    enumeration.foreach = function(f,c) {
        for(var i = 0; i < this.values.length; i++) f.call(c,this.values[i]);
    };

    // Return the constructor that identifies the new type
    return enumeration;
}


// Create a new Coin class with four values: Coin.Penny, Coin.Nickel, etc.
var Coin = enumeration({Penny: 1, Nickel:5, Dime:10, Quarter:25});
var c = Coin.Dime; // This is an instance of the new class


Скажите, как часто на практике вообще применяется подобное?
Ответить с цитированием
  #4 (permalink)  
Старый 26.07.2018, 16:08
Интересующийся
Отправить личное сообщение для RuBrain Посмотреть профиль Найти все сообщения от RuBrain
 
Регистрация: 20.04.2018
Сообщений: 21

И еще вопрос, в 24 строке определяется метод foreach, что нужно передавать в аргументы при его вызове?

Например я хочу вызвать его у объекта Coin. Что в (f, c) нужно?
Ответить с цитированием
  #5 (permalink)  
Старый 26.07.2018, 18:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

Сообщение от RuBrain
метод foreach, что нужно передавать в аргументы при его вызове?
Сообщение от Rise
function и context
function enumeration(namesToValues) {
    // This is the dummy constructor function that will be the return value.
    var enumeration = function() { throw "Can't Instantiate Enumerations"; };

    // Enumerated values inherit from this object.
    var proto = enumeration.prototype = {
        constructor: enumeration,                   // Identify type
        toString: function() { return this.name; }, // Return name
        valueOf: function() { return this.value; }, // Return value
        toJSON: function() { return this.name; }    // For serialization
    };

    enumeration.values = [];  // An array of the enumerated value objects

    // Now create the instances of this new type.
    for(name in namesToValues) {         // For each value
        var e = Object.create(proto);          // Create an object to represent it
        e.name = name;                   // Give it a name
        e.value = namesToValues[name];   // And a value
        enumeration[name] = e;           // Make it a property of constructor
        enumeration.values.push(e);      // And store in the values array
    }
    // A class method for iterating the instances of the class
    enumeration.foreach = function(f,c) {
        for(var i = 0; i < this.values.length; i++) f.call(c,this.values[i]);
    };

    // Return the constructor that identifies the new type
    return enumeration;
}


// Create a new Coin class with four values: Coin.Penny, Coin.Nickel, etc.
var Coin = enumeration({Penny: 1, Nickel:5, Dime:10, Quarter:25});
var c = Coin.Dime; // This is an instance of the new class
var s = {sum : 0};
function fn(a)
{
    this.sum += a.value
}
Coin.foreach(fn, s);
alert(s.sum)
Ответить с цитированием
  #6 (permalink)  
Старый 01.08.2018, 22:57
Интересующийся
Отправить личное сообщение для RuBrain Посмотреть профиль Найти все сообщения от RuBrain
 
Регистрация: 20.04.2018
Сообщений: 21

Подскажите, как понять следующий пример с использованием enumeration:

function enumeration(namesToValues) {
    // This is the dummy constructor function that will be the return value.
    var enumeration = function() { throw "Can't Instantiate Enumerations"; };

    // Enumerated values inherit from this object.
    var proto = enumeration.prototype = {
        constructor: enumeration,                   // Identify type
    };

    enumeration.values = [];  // An array of the enumerated value objects

    // Now create the instances of this new type.
    for(name in namesToValues) {         // For each value
        var e = Object.create(proto);          // Create an object to represent it
        e.name = name;                   // Give it a name
        e.value = namesToValues[name];   // And a value
        enumeration[name] = e;           // Make it a property of constructor
        enumeration.values.push(e);      // And store in the values array
    }
    // A class method for iterating the instances of the class
    enumeration.foreach = function(f,c) {
        for(var i = 0; i < this.values.length; i++) f.call(c,this.values[i]);
    };

    enumeration.print = function() {
        console.log(this.values);

    }

    // Return the constructor that identifies the new type
    return enumeration;
}


// Define a class to represent a playing card
function Card(suit, rank) {
    this.suit = suit;         // Each card has a suit
    this.rank = rank;         // and a rank
}

// These enumerated types define the suit and rank values
Card.Suit = enumeration({Clubs: 1, Diamonds: 2, Hearts:3, Spades:4});
Card.Rank = enumeration({Two: 2, Three: 3, Four: 4, Five: 5, Six: 6,
    Seven: 7, Eight: 8, Nine: 9, Ten: 10,
    Jack: 11, Queen: 12, King: 13, Ace: 14});


// Define a class to represent a standard deck of cards
function Deck() {
    var cards = this.cards = [];     // A deck is just an array of cards
    Card.Suit.foreach(function(s) {  // Initialize the array
        Card.Rank.foreach(function(r) {
            cards.push(new Card(s, r));
        });
    });
}

var deck = new Deck();


Не понятно что происходит при создании var deck. Откуда берутся s и r в параметрах , если они не объявлены никак ранее? И как опять тут срабатывает enumeration.foreach = function(f,c), каким образом там оказывается список Card.Suit и Card.Rank, если он не передается в параметрах. Помогите пожалуйста разобраться, уже и так и сяк пробовал дебагером смотреть, ничего не понятно.

Последний раз редактировалось RuBrain, 02.08.2018 в 05:35.
Ответить с цитированием
  #7 (permalink)  
Старый 02.08.2018, 05:50
Интересующийся
Отправить личное сообщение для RuBrain Посмотреть профиль Найти все сообщения от RuBrain
 
Регистрация: 20.04.2018
Сообщений: 21

https://c.radikal.ru/c03/1808/62/76c3d91add9b.png

Последний раз редактировалось RuBrain, 02.08.2018 в 05:53.
Ответить с цитированием
  #8 (permalink)  
Старый 02.08.2018, 08:47
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

Сообщение от RuBrain
Откуда берутся s и r в параметрах ,
Цитата:
currentValueТекущий обрабатываемый элемент в массиве.
/Array/forEach
Ответить с цитированием
  #9 (permalink)  
Старый 02.08.2018, 12:05
Интересующийся
Отправить личное сообщение для RuBrain Посмотреть профиль Найти все сообщения от RuBrain
 
Регистрация: 20.04.2018
Сообщений: 21

Сообщение от рони Посмотреть сообщение
/Array/forEach
ОК, если массив, то все понятно, но каким образом Card.Suit становится массивом? В дебагере если я останавливаюсь на нем, то это объект-функция с некоторыми значениями. В Card.Suit свой метод foreach, который принимает 2 аргумента f и c. С первым f вроде понятно, туда передается функция cards.push(new Card(suit, rank), а что с "c"?
Ответить с цитированием
  #10 (permalink)  
Старый 02.08.2018, 13:51
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

Сообщение от RuBrain
но каким образом Card.Suit становится массивом?
никаким, но в Card.Suit есть массив и есть метод обработки каждого элемента массива enumeration.foreach
значит s это f.call(c,this.values[i]); или currentValueТекущий обрабатываемый элемент в массиве.

enumeration.foreach не нативный, но он делает тоже самое что forEach в Array.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
стрелки вниз, верх при раздвижение блоков dima018 Элементы интерфейса 8 12.02.2018 21:29
Запустить пример с главной страницы Shasoft Angular.js 2 12.01.2014 20:55
Помогите повторить пример (Яндекс-карт) hrundel Общие вопросы Javascript 0 19.09.2013 18:45
nodeJS нужен пример кода для логина в сайт unet900 AJAX и COMET 0 02.07.2013 19:59
Пример из учебника на сайте jekahm Общие вопросы Javascript 4 04.10.2012 13:33