0

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

6 回答 6

2

!obj.hasOwnProperty("c")改为obj.hasOwnProperty(key). 这将显示不仅属于原型的属性(我认为这是您使用 的目标obj.hasOwnProperty)。如果像其他一些答案所假设的那样,您的目标是仅排除属性"c",则可以将 if 条件更改为if ( key !== "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(key)) {

      properties.push(key);
    }
  }
   return properties;

}

 looping(letters);
于 2016-05-13T21:47:42.760 回答
1

我想你想说的是这样的

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 (key !== "c") {

      properties.push(key);
    }
  }
  return properties;

}

alert(looping(letters));

您还应该将构造函数字母更改为Letters,大写“l”,并且不要对构造函数和实例使用相同的名称

于 2016-05-13T21:47:08.957 回答
0

这里的问题是,您正在检查是否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;
}
于 2016-05-13T22:07:10.323 回答
0

目前,您总是在检查您的对象是否有自己的属性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);
于 2016-05-13T21:47:37.183 回答
0

for循环将遍历keys实际对象及其原型的所有内容,您实际上是通过hasOwnProperty"c"调用中使用obj.hasOwnProperty("c")并否定它来破坏。所以根本没有效果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"]
于 2016-05-13T21:48:00.747 回答
0

hasOwnProperty 方法不会在原型链中查找属性。相反,只需使用in (like 'c' in obj)。

于 2016-05-13T21:48:39.320 回答