2016-05-13 86 views
0

我試圖排除屬性c,如果找到,所以它不會被添加到屬性數組,但是,它仍然被添加。爲什麼?hasOwnProperty - 原型 - 不起作用

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(key)'而不是'!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,資本「L」的東西,而不是對構造函數和實例使用相同的名稱

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從實際的對象和它的原型,你是通過在呼叫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"] 
0

hasOwnProperty方法不會查找財產的原型鏈。相反,只需使用中的(如'c' in obj)。

0

這裏的問題是,你正在檢查是否存在c作爲obj內財產,這將永遠是因爲你的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; 
}