首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从函数声明的堆栈访问变量

从函数声明的堆栈访问变量
EN

Stack Overflow用户
提问于 2018-09-12 06:50:23
回答 3查看 58关注 0票数 1

在使用函数风格而不是原型或伪经典风格为JavaScript创建堆栈接口时,下面的“存储”和“计数”变量是否应该分别为someInstance.storage和someInstance.count,以便稍后可以在此堆栈的实例上访问它们?

随着变量的声明,一旦我们通过执行函数创建了堆栈的实例,我们就失去了查看计数(大小)和存储(堆栈中的属性)的权限。

声明我们稍后需要使用函数式创建模式访问的属性(而不是方法)的最佳方法是什么?

谢谢!

代码语言:javascript
复制
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();
EN

回答 3

Stack Overflow用户

发布于 2018-09-12 06:55:08

下面提到的私有变量可以在closure的javascript中研究。

参考:https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Closures

代码语言:javascript
复制
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();
票数 1
EN

Stack Overflow用户

发布于 2018-09-12 14:47:41

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-09-12 14:57:25

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52285157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档