在不使用Instance Ids Javascript的情况下成为私有成员

时间:2015-10-25 19:34:00

标签: javascript

我有一个LinkedList类,我希望将实例的head成员设为私有。我看到如何为每个实例创建一个密钥ID,并隐藏LinkedList类的用户成员。寻找其他方式使this.head私有

function LinkedList() {
    this.head = null;
};

LinkedList.prototype = (function () {
    function reverseAll(current, prev) {
        if (!current.next) { //we have the head
            this.head = current;
            this.head.next = prev;
        }

        var next = current.next;
        current.next = prev;

        reverseAll(next, current);
    };

    return {
        constructor: LinkedList,

        reverse: function () {
            reverseAll(this.head, null);
        },

        head: function() {
            return this.head;
        }
    }
})();

LinkedList.prototype.add = function(value) {
    var node = {
        value: value,
        next: null
    };

    var current;

    if (this.head === null) {
        this.head = node;
    } else {
        current = this.head;
        while (current.next) {
            current = current.next;
        }
        current.next = node;
    }

    return node;
}

LinkedList.prototype.remove = function(node) {
    var current, value = node.value;

    if (this.head !== null) {
        if (this.head === node) {
            this.head = this.head.next;
            node.next = null;
            return value;
        }
        //find node if node not head
        current = this.head;
        while (current.next) {
            if (current.next === node) {
                current.next = node.next;
                return value;
            }

            current = current.next;
        }
    }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
$(function() {
    var obj = new LinkedList();
    
    for (var i = 1; i <= 10; i++) {
        obj.add(i);
    }
  
  console.log(obj.head);
  obj.head = 'pwned';
  console.log(obj.head);
});
</script>

1 个答案:

答案 0 :(得分:0)

我能想到的唯一方法就是这样的某种憎恶:

function LinkedList() {
    let head = null; 
    // Instead of using a prototype, you attach the methods directly to this.
    // This makes the methods unique per instance, so you can attach privately
    // scoped variables (like head).
    this.reverse = function() { 
        // You may use head here.
    };
    this.head = function() { ... };
}

然而,这是高度效率低下,因为您将在每次调用时创建一组全新的闭包。

即使像模块模式(或显示模块模式)这样的解决方案也会遇到此问题。如果您没有创建太多此对象,则上面的示例可能适合您。