[英]hasOwnProperty - prototype - doesn't work
我试图排除找到的属性c,因此不会将其添加到properties数组中,但是仍在添加中。 为什么?
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);
我将!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);
我想你想说的是这样的
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”,并且不要对构造函数和实例使用相同的名称
当前,您始终在检查对象是否具有自己的属性c
。 由于c
在您的letter实例的原型链中(顺便说一下,您将使用它们重写函数引用!),所以此检查将始终导致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
,实际上您是通过在调用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"]
hasOwnProperty方法不在原型链中查找属性。 而是只使用in (例如'c' in obj
)。
这里的问题是,您正在检查c
是否作为obj
中的属性存在,因为根据我所知,您的obj不会通过原型功能获得“ ownProperty ” c,因此它将始终为false
。 由于您要否定表达式obj.hasOwnProperty("c")
因此它将始终为true,从而将数组中的每个键都压入。 也许您想要这样的东西。
function looping(obj) {
var properties = [];
for (var key in obj) {
if(key !== "c") properties.push(key);
}
return properties;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.