Javascript hasOwnProperty-prototype-dons';行不通
我试图排除属性c(如果找到的话),这样它就不会被添加到属性数组中,但是,它仍然被添加。为什么?Javascript hasOwnProperty-prototype-dons';行不通,javascript,prototype,hasownproperty,Javascript,Prototype,Hasownproperty,我试图排除属性c(如果找到的话),这样它就不会被添加到属性数组中,但是,它仍然被添加。为什么? var letters = function () { this.a = 5; this.b = 20; }; letters.prototype = { c: 10 }; var letters = new letters(); function looping(obj) { var properties = []; for (var key in obj) { i
var letters = function () {
this.a = 5;
this.b = 20;
};
letters.prototype = {
c: 10
};
var letters = new letters();
function looping(obj) {
var properties = [];
for (var key in obj) {
if (!obj.hasOwnProperty("c")) {
properties.push(key);
}
}
return properties;
}
looping(letters);
我想你想说的是这样的
var字母=函数(){
这个a=5;
这个b=20;
};
字母。原型={
c:10
};
变量字母=新字母();
函数循环(obj){
var属性=[];
for(obj中的var键){
如果(键!=“c”){
属性。按(键);
}
}
归还财产;
}
警报(循环(字母))代码>我想你想说的是这样的
var字母=函数(){
这个a=5;
这个b=20;
};
字母。原型={
c:10
};
变量字母=新字母();
函数循环(obj){
var属性=[];
for(obj中的var键){
如果(键!=“c”){
属性。按(键);
}
}
归还财产;
}
警报(循环(字母))代码>当前,您总是在检查对象是否有自己的属性c
。由于c
位于字母实例的原型链中(顺便说一句,您正在用它覆盖函数引用!),因此此检查将始终导致false
我不完全确定您是只想在原型链上排除c
,还是想从原型中排除所有属性?我将在以下代码中假设第一个选项:
var Letters = function () {
this.a = 5;
this.b = 20;
};
Letters.prototype = {
c: 10
};
var myLetters = new Letters();
function looping(obj) {
var properties = [];
for (var key in obj) {
if (key !== 'c' || obj.hasOwnProperty(key)) {
properties.push(key);
}
}
return properties;
}
looping(myLetters);
当前,您总是在检查对象是否有自己的属性c
。由于c
位于字母实例的原型链中(顺便说一句,您正在用它覆盖函数引用!),因此此检查将始终导致false
我不完全确定您是只想在原型链上排除c
,还是想从原型中排除所有属性?我将在以下代码中假设第一个选项:
var Letters = function () {
this.a = 5;
this.b = 20;
};
Letters.prototype = {
c: 10
};
var myLetters = new Letters();
function looping(obj) {
var properties = [];
for (var key in obj) {
if (key !== 'c' || obj.hasOwnProperty(key)) {
properties.push(key);
}
}
return properties;
}
looping(myLetters);
我改变了!对象hasOwnProperty(“c”)
到对象hasOwnProperty(键)
。这将显示不仅属于原型的属性(我假设这是您使用obj.hasOwnProperty
的目标)。如其他一些答案所假设的,如果您的目标是仅排除属性“c”
,则可以将If条件更改为If(key!==“c”)
我改变了!对象hasOwnProperty(“c”)
到对象hasOwnProperty(键)
。这将显示不仅属于原型的属性(我假设这是您使用obj.hasOwnProperty
的目标)。如其他一些答案所假设的,如果您的目标是仅排除属性“c”
,则可以将If条件更改为If(key!==“c”)
for
循环将通过实际对象及其原型的所有键,通过在调用obj.hasOwnProperty(“c”)
中使用“c”
并对其进行否定,实际上是在破坏hasOwnProperty
。因此,hasOwnProperty
根本没有效果
正确的做法是:
function looping(obj){
var properties=[];
for (var key in obj){
if (obj.hasOwnProperty(key)) {
properties.push(key);
}
}
return properties;
}
console.log(looping(letters)); //prints ["a", "b"]
for
循环将通过实际对象及其原型的所有键,通过在调用obj.hasOwnProperty(“c”)
中使用“c”
并对其进行否定,实际上是在破坏hasOwnProperty
。因此,hasOwnProperty
根本没有效果
正确的做法是:
function looping(obj){
var properties=[];
for (var key in obj){
if (obj.hasOwnProperty(key)) {
properties.push(key);
}
}
return properties;
}
console.log(looping(letters)); //prints ["a", "b"]
hasOwnProperty方法不在原型链中查找属性。相反,只需在中使用(如obj中的'c
)。hasOwnProperty方法不会在原型链中查找属性。相反,只需在中使用(如obj中的'c
)。这里的问题是,您正在检查c
是否作为属性存在于您的obj
中,这将始终是false
,因为据我所知,您的obj不具备原型功能中的“ownProperty”c。由于您对表达式obj.hasOwnProperty(“c”)
求反,因此它将始终为真,从而按下数组中的每个键。也许你想要这样的东西
function looping(obj) {
var properties = [];
for (var key in obj) {
if(key !== "c") properties.push(key);
}
return properties;
}
这里的问题是,您正在检查c
是否作为属性存在于您的obj
中,该属性将始终为false
,因为据我所知,您的obj不具有原型功能的“ownProperty”c。由于您对表达式obj.hasOwnProperty(“c”)
求反,因此它将始终为真,从而按下数组中的每个键。也许你想要这样的东西
function looping(obj) {
var properties = [];
for (var key in obj) {
if(key !== "c") properties.push(key);
}
return properties;
}
您希望从循环中得到什么结果?您是否打算使用!对象hasOwnProperty(键)
而不是!obj.hasOwnProperty(“c”)
?或者只是如果(key=='c'){
…你希望从循环中得到什么结果?你可能想使用!obj.hasOwnProperty(key)
,而不是!obj.hasOwnProperty(“c”)
?或者只是如果(key=='c'){/code>。。。