zoukankan      html  css  js  c++  java
  • hasOwnProperty

    hasOwnProperty函数

    为了判断一个对象是否包含自定义属性而不是原型链上的属性, 我们需要使用继承自 Object.prototype 的 hasOwnProperty 方法。

    hasOwnProperty 是 JavaScript 中唯一一个处理属性但是查找原型链的函数。

    注意: 通过判断一个属性是否undefined是不够的。 因为一个属性可能确实存在,只不过它的值被设置为undefined。

    1 // 修改Object.prototype
    2 Object.prototype.bar = 1; 
    3 var foo = {goo: undefined};
    4 foo.bar; // 1
    5 'bar' in foo; // true
    6 foo.hasOwnProperty('bar'); // false
    7 foo.hasOwnProperty('goo'); // true

    只有 hasOwnProperty 可以给出正确和期望的结果,这在遍历对象的属性时会很有用。 没有其它方法可以用来排除原型链上的属性,而不是定义在对象自身上的属性。

    hasOwnProperty 作为属性

    JavaScript 不会保护 hasOwnProperty 被非法占用,因此如果一个对象碰巧存在这个属性, 就需要使用外部的 hasOwnProperty 函数来获取正确的结果。

    1 var foo = {
    2     hasOwnProperty: function() {
    3         return false;
    4     },
    5     bar: 'Here be dragons'
    6 };
    7 foo.hasOwnProperty('bar'); // 总是返回 false
    8 // 使用其它对象的 hasOwnProperty,并将其上下文设置为foo
    9 ({}).hasOwnProperty.call(foo, 'bar'); // true
    结论

    当检查对象上某个属性是否存在时,hasOwnProperty 是唯一可用的方法。 同时在使用 for in loop 遍历对象时,推荐总是使用 hasOwnProperty 方法, 这将会避免原型对象扩展带来的干扰。

    for in 循环

    和 in 操作符一样,for in 循环同样在查找对象属性时遍历原型链上的所有属性。
    注意: for in 循环不会遍历那些 enumerable 设置为false 的属性;比如数组的length 属性。

    1 // 修改 Object.prototype
    2 Object.prototype.bar = 1;
    3 var foo = {moo: 2};
    4 for(var i in foo) {
    5     console.log(i); // 输出两个属性:bar 和 moo
    6 }

    由于不可能改变 for in 自身的行为,因此有必要过滤出那些不希望出现在循环体中的属性, 这可以通过 Object.prototype 原型上的 hasOwnProperty 函数来完成。

    使用 hasOwnProperty 过滤

    注意: 由于 for in 总是要遍历整个原型链,因此如果一个对象的继承层次太深的话会影响性能。

    1 // foo 变量是上例中的
    2 for(var i in foo) {
    3     if (foo.hasOwnProperty(i)) {
    4         console.log(i);
    5     }
    6 }

    这个版本的代码是唯一正确的写法。由于我们使用了 hasOwnProperty,所以这次输出 moo。 如果不使用 hasOwnProperty,则这段代码在原生对象原型(比如 Object.prototype)被扩展时可能会出错。
    一个广泛使用的类库 Prototype 就扩展了原生的 JavaScript 对象。 因此,当这个类库被包含在页面中时,不使用 hasOwnProperty 过滤的 for in 循环难免会出问题。

    总结

    推荐总是使用 hasOwnProperty。不要对代码运行的环境做任何假设,不要假设原生对象是否已经被扩展了。

    http://www.jianshu.com/p/714e7f47d90f

  • 相关阅读:
    笔记35 跨重定向请求传递数
    判断邮箱的正则表达式
    按钮
    async await 的用法
    笔记34 Spring MVC的高级技术——处理multipart形式的数据
    Convert Sorted Array to Binary Search Tree
    Binary Tree Zigzag Level Order Traversal
    Unique Binary Search Trees,Unique Binary Search Trees II
    Validate Binary Search Tree
    Populating Next Right Pointers in Each Node,Populating Next Right Pointers in Each Node II
  • 原文地址:https://www.cnblogs.com/linsx/p/6815740.html
Copyright © 2011-2022 走看看