繁体   English   中英

hasOwnProperty-原型-不起作用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM