在使用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>
答案 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”。