Доступ к переменным из функционально объявленного стека - PullRequest
0 голосов
/ 12 сентября 2018

При создании интерфейса для стека в JavaScript - с использованием функционального стиля в противоположность прототипному или псевдоклассическому стилю, должны ли указанные ниже переменные «storage» и «count» иметь значения someInstance.storage и someInstance.count, соответственно, чтобы они могли бытьдоступ к экземпляру этого стека позже?

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

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

Спасибо!

var Stack = function(){
  var someInstance = {};

  var storage = {};
  var count = 0;


  someInstance.push = function(value){
    storage[count++] = value;
  };

  someInstance.pop = function(){

    if(count){
      var popped = storage[--count];
    }

    delete storage[count];

    return popped;

  };

  someInstance.size = function(){
    return count;

  };

  return someInstance;
};

var stack = Stack();

Ответы [ 5 ]

0 голосов
/ 12 сентября 2018

function Person(first, last, age, eye) {
    this.firstName = first;
    this.lastName = last;
    this.age = age;
    this.eyeColor = eye;
}

Person.prototype.nationlity='Indian';

Person.prototype.fullname = function() {
    return this.firstName + " " + this.lastName
};

var myFather = new Person("Lalji", "Maurya", 50, "blue");
console.log(myFather.fullname());
console.log(myFather); 
console.log(myFather.nationlity); 

var myBrother = new Person("Ashish", "Maurya", 28, "black");
console.log(myBrother.fullname());
console.log(myBrother); 
console.log(myBrother.nationlity); 
0 голосов
/ 12 сентября 2018

var Stack = function(){ 
    let storage = [], count = 0; // these will be caputured as a closure

    return {
        // the returned object will have push, pop, and a count getter
        push(v) {  //method
            storage.push(v)
            count++
        },
        pop: function() {
            if (count) count--
            return storage.pop()
        },
        get count(){      // allow reading of count
            return count
        },
		get insidebox(){      // allow reading of count
            return storage
        },
		callprice:function(cnt){		 
		var price=cnt*100;
		return price;
		}

    } 
}


Stack.prototype.price2 = function() {
    return "testpr";
};

var sb =  Stack();
console.log(sb.count);
sb.push('paint');
console.log(sb.insidebox);
console.log(sb.count); 
sb.push('Sharee');
console.log(sb.insidebox);
sb.push('Shirt'); 
sb.push('shoes');
console.log(sb.insidebox);
sb.pop();
console.log(sb.insidebox);
console.log(sb.count);
console.log(sb.callprice(sb.count));
0 голосов
/ 12 сентября 2018

storage и count должны быть someInstance.storage и someInstance.count, зависит от того, как вы хотите, чтобы пользователь этого экземпляра работал. Это немного основано на мнении. Мое мнение таково, что стек не должен позволять пользователю изменять счет с чем-то вроде someInstance.count = 10, потому что это сломало бы его.

Лично я бы сделал count и storage приватными, что предотвратит случайные ошибки, которые могут произойти при прямом доступе. Хороший способ сделать это состоит в том, чтобы захватить их в замыкании и предоставить получатель для count, чтобы вы могли все еще прочитать счетчик, но не можете его изменить. Что-то вроде:

var Stack = function(){ 
    let storage = [], count = 0; // these will be caputured as a closure

    return {
        // the returned object will have push, pop, and a count getter
        push(v) {
            storage.push(v)
            count++
        },
        pop() {
            if (count) count--
            return storage.pop()
        },
        get count(){      // allow reading of count
            return count
        }

    } 
}
var stack =  Stack();
stack.push("hello");
stack.push("goodby");
stack.count = 10          // has no effect

console.log(stack.count)  // count is still 2
console.log(stack.pop())

console.log(stack.count)
console.log(stack.pop())

console.log(stack.count)

Конечно, поскольку в основном используется массив, вы можете полностью отказаться от переменной count и просто использовать storage.length

0 голосов
/ 12 сентября 2018

Вы можете добавить геттеры и сеттеры для них в объекте someInstance (благодаря замыканиям) следующим образом:

Object.defineProperty(someInstance, "count", {
   get: function() {
      return count;
   },
   set: function(value) {
      count = value;
   }
});

Вы можете опустить часть set, если хотите иметь возможность простополучить значение и не устанавливать его.

Пример:

var Stack = function(){
  var someInstance = {};

  var storage = {};
  var count = 0;

  Object.defineProperty(someInstance, "count", {
    get: function() {
      console.log("getter called");
      return count;
    },
    set: function(value) {
      console.log("setter called");
      count = value;
    }
  });

  return someInstance;
};

var stack = Stack();

console.log(stack.count);
stack.count = 55;
console.log(stack.count);
0 голосов
/ 12 сентября 2018

Частные переменные, упомянутые ниже, могут быть изучены в javascript closure.

ссылка: https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Closures

var Stack = function(){
  // PUBLIC
  var someInstance = {};

  // PRIVATE: Attach _ to private variables. (just implicit rule.)
  var _storage = {};
  var _count = 0;


  someInstance.push = function(value){
    storage[_count++] = value;
  };

  someInstance.pop = function(){

    if(_count){
      var popped = storage[--_count];
    }

    delete storage[_count];

    return popped;

  };

  someInstance._size = function(){
    return _count;

  };

  // if you assign public variable, you can access!!!
  someInstance.size = _size;
  someInstance.count = _count;

  return someInstance;
};

var stack = Stack();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...