为什么是真的?方法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") );
答案 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
)。
foo
是obj
的可枚举(继承)属性,因此会添加到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