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;
}