今天想用js实现一个栈,原始代码如下:<script>
function stack(){
this.data='';   
this.next=null;
this.push=function(d){
var tmp=new stack()
tmp.data=d;
tmp.next=this.next;
this.next=tmp;
}
this.pop=function(){
var tmp=new stack()
tmp=this.next;
this.next=tmp.next;
return tmp.data;
}
} var s=new stack();
s.push("10");
s.next.data='111'; //问题在这里,我不希望用户可以这样直接访问类的next或data属性。
s.push("20");
s.push("30");
alert(s.pop());
alert(s.pop());
alert(s.pop());

</script>

解决方案 »

  1.   

    我看楼主的push与pop看得很混乱。。
    s.next.data='111';
    如果不想用户直接访问,就将data与next改成私有变量function stack(){
            var data = '';
            var next = null;
            this.setData = function(_data){
                 //给出接口设置data
            }
            this.getData = function(_){
                 //给出接口访问data
            }
        }
      

  2.   

    js 数组 自己就支持 pop 和push 方法
      

  3.   

    这个protect member的问题,js解决起来比较困难。
    要么用闭包把值直接固定到函数中,同时用类似工厂的模式来创建对象。
      

  4.   

    终于解决,如下:<script>
    function stack(){
    var next=null;
    this.push=function(d){
    var tmp=new stack()
    tmp.data=d;
    tmp.next=next;
    next=tmp;
    }
    this.pop=function(){
    var tmp=new stack()
    tmp=next;
    next=tmp.next;
    return tmp.data;
    }
    } var s=new stack();
    s.push("10");
    alert(s.next);
    s.push("20");
    s.push("30");
    alert(s.pop());
    alert(s.pop());
    alert(s.pop());

    </script>