2016-05-13 4 views
0

Я пытаюсь исключить свойство c, если оно найдено, поэтому оно не будет добавлено в массив свойств, однако оно добавляется до сих пор. Зачем?hasOwnProperty - prototype - не работает

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); 
+0

какой результат вы ожидаете/хотите от 'looping'? Возможно, вы хотите использовать '! Obj.hasOwnProperty (ключ)', а не '! Obj.hasOwnProperty (« c »)'? – Hamms

+0

или просто 'if (key === 'c') {' ... –

ответ

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

0

В настоящее время вы всегда проверяете, ct имеет собственный Недвижимость 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); 
2

Я изменил !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); 
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"] 
0

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

0

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

function looping(obj) { 
    var properties = []; 
    for (var key in obj) { 
    if(key !== "c") properties.push(key); 
    } 
    return properties; 
}