为什么Javascript实例对象中的奇怪重复?

时间:2017-02-06 03:31:30

标签: javascript

在使用Javascript获得乐趣的同时,我遇到了围绕类和对象的困难。我以为我知道它不是Java,也不是c ++。最后,我把我的问题带到了一个小例子来研究这个问题。

运行示例会产生输出:

>>>>>> keys aprop,bprep,cprep,dprop,bprop,cprop.

我期待输出:

>>>>>> keys aprop,bprep,cprep,dprop.

如果重复,为什么不aprop和dprop也重复?我原以为通过使用 getOwnPropertyNames 我阻止了原型键。有没有办法解决这个问题,比较每个密钥以消除重复?

<script>

var objList = [];


class TestObj {
    constructor(aprop, bprop, cprop) {
        this.aprop = aprop;
        this.bprep = bprop;
        this.cprep = cprop;
        this.dprop = 0;
    }
    getAprop() { return aprop; }
    getBprop() { return bprop; }
    getCprop() { return cprop; }
    getDprop() { return dprop; }

    setAprop(arg) { aprop = arg; }
    setBprop(arg) { bprop = arg; }
    setCprop(arg) { cprop = arg; }
    setDprop(arg) { dprop = arg; }
}

function create() {
    putList();
    var t1 = objList[1];
    alert("fromlist "+t1);

    var keys = Object.getOwnPropertyNames(t1);
    console.log(">>>>>> keys "+keys);
}

function putList() {    
    onlist(1, "one" [1]);
    onlist(2, "two", [2, 2]);
    onlist(3, "three", [3, 3, 3]);
}
function onlist(a, b, c) {
    var item = new TestObj();
    item.aprop = a;
    item.bprop = b;
    item.cprop = c;
    objList.push(item);
}


create();

</script>

1 个答案:

答案 0 :(得分:3)

我希望这实际上是你的问题。无论如何,这里是:

首先,一个最小的例子:

function Foo() {
    this.bar = 0;
}

Object.keys(new Foo)

此表达式的结果是["bar"]而不是[],因为在构造函数中设置属性与在其他任何位置设置它们没有区别。他们只是因为在构造函数中而不在原型上。这可行:

function Foo() {}
Foo.prototype.bar = 0;

Object.keys(new Foo)

现在bar位于原型上,Object.keys仅列出自己的属性名称,为[]实例返回Foo。但这通常不是你想要的;在实例上分配给bar仍然会创建一个新的属性,如果它是可变的,那么改变它会影响Foo的所有实例。

  

有没有办法解决这个问题,比较每个密钥以消除重复?

首先不要遍历属性。

......并且在偶然的情况下,你的意思是“重复”,请注意你拼写不同:“bpr e p”和“cpr e p”vs 。“bpr o p”和“cpr o p”。