不明白结果hasOwnProperty

时间:2015-08-31 23:53:19

标签: javascript

为什么是真的?方法foo如何写在对象中?

Object.prototype.foo = function(obj) {
    for(var i in obj) this[i] = obj[i];
};

var obj = {a: 1};

var testObj = {};

testObj.foo(obj)

alert( testObj.hasOwnProperty("foo") );

3 个答案:

答案 0 :(得分:3)

for ... in循环遍历所有目标对象的可见属性,包括其原型链上的那些属性。

如果您只想传输源对象的“自己”属性,可以添加测试:

Object.prototype.foo = function(obj) {
    for(var i in obj) 
      if (obj.hasOwnProperty(i))
        this[i] = obj[i];
};

答案 1 :(得分:3)

使用testObj.foo(obj)时,调用foo方法时this值设置为testObj

因此,这段代码......

for(var i in obj) this[i] = obj[i];

...将obj的可枚举(自有或继承)属性添加为this的自有属性(在本例中为testObj)。

fooobj的可枚举(继承)属性,因此会添加到testObj

答案 2 :(得分:3)

Object.prototype.foo = function(obj) {
    for(var i in obj) this[i] = obj[i];
};

var obj = {a: 1};

var testObj = {};

alert( testObj.hasOwnProperty("foo") ); // false

testObj.foo(obj)

alert( testObj.hasOwnProperty("foo") ); // true

正如您所看到的,在调用foo之后,foo方法附加到对象。

为什么呢?因为for..in将迭代所有可枚举的键,无论它们是在对象上还是在其原型之上。

Object.prototype.foo = function(obj) {
   for ( var i in obj ) {
      console.log(i, '=', obj.hasOwnProperty(i)); // foo=false
   }
};

' foo'方法是可枚举的,您可以使用

进行检查
Object.prototype.propertyIsEnumerable("foo") // true

如何使财产不可枚举?

Object.defineProperty(Object.prototype, 'foo', {
  'configurable': true, // can be removed using 'delete' operator
  'enumerable': false, // will not show up in a for..in iteration
  'writable': true, // can be overridden
  'value': function () {
     for ( var key in this ) {
          console.log(key, '=', this.hasOwnProperty(key));
     }
   }
});

万一你想知道:

Object.prototype.propertyIsEnumerable("hasOwnProperty") // false
Object.prototype.propertyIsEnumerable("propertyIsEnumerable") // false