2017-02-06 43 views
0

在使用Javascript获取乐趣时,我遇到了围绕类和对象的困难。我以为我知道它不是Java,也不是C++。最后,我将我的问题转化为一个小例子来研究这个问题。为什么Javascript实例对象中有奇怪的重复?

运行示例生成输出:

>>>>>> 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> 
+4

这可能有助于使您的示例更加简单;你创建了一堆对象,但只有其中一个被使用,并且getters和setter不是必需的,并且实际上不工作。也许把它减少到'function TestObj(){this.aprop = 0; } var keys = Object.getOwnPropertyNames(new TestObj());的console.log(键);'? – Ryan

+0

你在哪里设置'Testobj.prototype.somekey'? – Paul

+1

没有重复。你只是拼错了一些专有名称。 – Bergi

回答

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 è p”和“心肺复苏è P”与“BPR Ø p”和“cpr o p”。

相关问题