Vue源码学习之hasOwnProperty()

2,638 阅读2分钟

源码内容:

/**
* Check whether an object has the property.
*/
var hasOwnProperty = Object.prototype.hasOwnProperty;
function hasOwn (obj, key) {
return hasOwnProperty.call(obj, key)
}

1.hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。

所有继承了 Object 的对象都会继承到 hasOwnProperty 方法。这个方法可以用来检测一个对象是否含有特定的自身属性;和 in 运算符不同,该方法会忽略掉那些从原型链上继承到的属性。即继承的属性不显示。

例如:

o = new Object();
o.prop = 'exists';
o.hasOwnProperty('prop');             // 返回 true 自身的属性显示
o.hasOwnProperty('toString');         // 返回 false 继承的属性不显示
o.hasOwnProperty('hasOwnProperty');   // 返回 false 继承的属性不显示

2.for...in语句以任意顺序遍历一个对象的除Symbol以外的可枚举属性。

for ... in是为遍历对象属性而构建的,不建议与数组一起使用,数组可以用Array.prototype.forEach()for ... of。需要检查其中的任何键是否为某值的情况时,还是推荐用for ... in。

例如:下面是hasOwnProperty()和for...in的不同结果

var triangle = {a: 1, b: 2, c: 3};

function ColoredTriangle() {
  this.color = 'red';
}

ColoredTriangle.prototype = triangle;

var obj = new ColoredTriangle();

// 1.使用hasOwnProperty
for (var prop in obj) {
    if (obj.hasOwnProperty(prop)) {
        console.log(`obj.${prop} = ${obj[prop]}`);
    } 
}
// Output:
// "obj.color = red"
// 2.直接使用for...in输出
for (var prop in obj) {
    console.log(`obj.${prop} = ${obj[prop]}`); }

// Output:
// obj.color = red
// obj.a = 1
// obj.b = 2
// obj.c = 3

以下重点:

JavaScript 并没有保护 hasOwnProperty 这个属性名,因此,当某个对象可能自有一个占用该属性名的属性时,就需要使用外部的 hasOwnProperty 获得正确的结果:

var foo = {
  hasOwnProperty: function() {
    return false;
  },
  bar: 'Here be dragons'
};

foo.hasOwnProperty('bar'); // 始终返回 false

// 如果担心这种情况,
// 可以直接使用原型链上真正的 hasOwnProperty 方法
({}).hasOwnProperty.call(foo, 'bar'); // true

// 也可以使用 Object 原型上的 hasOwnProperty 属性
Object.prototype.hasOwnProperty.call(foo, 'bar'); // true

注意,只有在最后一种情况下,才不会新建任何对象。推荐使用Object.prototype.hasOwnProperty.call(obj, key);