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) {
    if (!obj.hasOwnProperty("c")) {

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

}

looping(letters);

6 ответов

Я изменился !obj.hasOwnProperty("c") в obj.hasOwnProperty(key), Это отобразит свойства, которые не принадлежат только прототипу (который, как я предполагал, был вашей целью при использовании obj.hasOwnProperty). Если, как предполагают некоторые другие ответы, ваша цель состоит в том, чтобы исключить только свойство "c", вы можете изменить, если условие 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);

Я думаю, что вы хотели сказать, что-то вроде этого

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" и не использовать одно и то же имя для конструктора и экземпляра

Метод hasOwnProperty не ищет свойства в цепочке прототипов. Вместо этого просто используйте в (как 'c' in obj).

В настоящее время вы всегда проверяете, есть ли у вашего объекта собственное свойство 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);

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"]

Проблема в том, что вы проверяете, c существует как собственность в вашем obj который всегда будет false так как ваш объект не будет иметь "ownProperty" c функциональностью прототипа, насколько я знаю. Так как вы отрицаете выражение obj.hasOwnProperty("c") это всегда будет верно, таким образом, нажимая каждую клавишу в вашем массиве. Может быть, вы хотите что-то подобное.

function looping(obj) {
  var properties = [];
  for (var key in obj) {
    if(key !== "c") properties.push(key);
  }
  return properties;
}
Другие вопросы по тегам