Javascript hasOwnProperty-prototype-dons';行不通

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

我试图排除属性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) {
    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>。。。