zoukankan      html  css  js  c++  java
  • js属性对象的hasOwnProperty方法

    Object的hasOwnProperty()方法返回一个布尔值,判断对象是否包含特定的自身(非继承)属性。

    判断自身属性是否存在

    var o = new Object();
    o.prop = 'exists';
    
    function changeO() {
      o.newprop = o.prop;
      delete o.prop;
    }
    
    o.hasOwnProperty('prop');  // true
    changeO();
    o.hasOwnProperty('prop');  // false

    判断自身属性与继承属性

    function foo() {
      this.name = 'foo'
      this.sayHi = function () {
        console.log('Say Hi')
      }
    }
    
    foo.prototype.sayGoodBy = function () {
      console.log('Say Good By')
    }
    
    let myPro = new foo()
    
    console.log(myPro.name) // foo
    console.log(myPro.hasOwnProperty('name')) // true
    console.log(myPro.hasOwnProperty('toString')) // false
    console.log(myPro.hasOwnProperty('hasOwnProperty')) // fasle
    console.log(myPro.hasOwnProperty('sayHi')) // true
    console.log(myPro.hasOwnProperty('sayGoodBy')) // false
    console.log('sayGoodBy' in myPro) // true

    遍历一个对象的所有自身属性

    在看开源项目的过程中,经常会看到类似如下的源码。for...in循环对象的所有枚举属性,然后再使用hasOwnProperty()方法来忽略继承属性。

    eg:1

    var
    buz = { fog: 'stack' }; for (var name in buz) { if (buz.hasOwnProperty(name)) { alert("this is fog (" + name + ") for sure. Value: " + buz[name]); } else { alert(name); // toString or something else } }

    eg:2 深克隆
    function DeepClone(source) {
    // 判断目标是数组还是对象
    const targetObj = source.constructor === Array ? [] : {};
    for (let key in source) {
    if (source.hasOwnProperty(key)) {
    // 如果是对象就递归
    if (source[key] && typeof source[key] === 'object') {
    targetObj[key] = source[key].constructor === Array ? [] : {}
    targetObj[key] = DeepClone(source[key])
    } else {
    targetObj[key] = source[key]
    }
    }
    }
    return targetObj
    }

    注意 hasOwnProperty 作为属性名

    JavaScript 并没有保护 hasOwnProperty 属性名,因此,可能存在于一个包含此属性名的对象,有必要使用一个可扩展的hasOwnProperty方法来获取正确的结果:

    var foo = {
        hasOwnProperty: function() {
            return false;
        },
        bar: 'Here be dragons'
    };
    
    foo.hasOwnProperty('bar'); // 始终返回 false
    
    // 如果担心这种情况,可以直接使用原型链上真正的 hasOwnProperty 方法
    // 使用另一个对象的`hasOwnProperty` 并且call
    ({}).hasOwnProperty.call(foo, 'bar'); // true
    
    // 也可以使用 Object 原型上的 hasOwnProperty 属性
    Object.prototype.hasOwnProperty.call(foo, 'bar'); // true

    参考链接

    [完]

  • 相关阅读:
    MATLAB符号运算(2)
    ruby的字符串
    MATLAB符号运算(3)
    ruby的lambda
    MATLAB概率统计函数(2)
    ruby的迭代
    MATLAB优化问题(2)
    ruby的方法和block
    MATLAB优化问题(1)
    ruby的正则表达式操作(3)
  • 原文地址:https://www.cnblogs.com/queenDream/p/13515830.html
Copyright © 2011-2022 走看看