这是否:
function isplainobj ( obj ) {
return Object.prototype.toString.call( obj ) === "[object Object]";
}
做和 jQuery 一样的事情: $.isPlainObject() ?
这是否:
function isplainobj ( obj ) {
return Object.prototype.toString.call( obj ) === "[object Object]";
}
做和 jQuery 一样的事情: $.isPlainObject() ?
这个简单的测试应该可以做到
obj!=null && typeof(obj)=="object" && Object.getPrototypeOf(obj)==Object.prototype
//确保 Object.getPrototypeOf
Object.getPrototypeOf||(Object.getPrototypeOf=function(obj){
return obj.__proto__ || obj.prototype || (obj.constructor&&obj.constructor.prototype) || Object.prototype
});
不,它没有。
这是它的实现:
isPlainObject: function( obj ) {
var key;
// Must be an Object.
// Because of IE, we also have to check the presence of the constructor property.
// Make sure that DOM nodes and window objects don't pass through, as well
if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
return false;
}
try {
// Not own constructor property must be Object
if ( obj.constructor &&
!core_hasOwn.call(obj, "constructor") &&
!core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
return false;
}
} catch ( e ) {
// IE8,9 Will throw exceptions on certain host objects #9897
return false;
}
// Support: IE<9
// Handle iteration over inherited properties before own properties.
if ( jQuery.support.ownLast ) {
for ( key in obj ) {
return core_hasOwn.call( obj, key );
}
}
// Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own.
for ( key in obj ) {}
return key === undefined || core_hasOwn.call( obj, key );
},
它检查它的类型是否是对象,是否有构造函数以及它的属性是否是自己的属性。
例如,对于您的函数,一个类的实例将返回 true,但在这种情况下,因为它有一个构造函数,它将返回 false。
根据这里的 jQuery 源代码http://james.padolsey.com/jquery/#v=1.10.2&fn=jQuery.isPlainObject,我已经经历了在 jQuery 的普通对象中处理的所有可能性。您提到的功能正在通过所有测试。两者的表现方式相同。请检查以下测试用例
isplainobj({});
真的isplainobj(函数(){});
错误的isplainobj(文档);
错误的isplainobj(窗口);
错误的isplainobj($);
错误的isplainobj({});
真的isplainobj(isplainobj);
错误的isplainobj({});
真的
根据我的理解,拥有所有属性的对象是一个普通的对象。如果我错了,请纠正我。
编辑:
根据jQuery中的以下几行
// Not own constructor property must be Object
if (obj.constructor && !core_hasOwn.call(obj, "constructor") && !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) {
return false;
}
对象不应该有自己的属性constructor
,obj.constructor.prototype
也不应该isPrototypeOf
确保它不在原型链中。请查看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isPrototypeOf了解更多信息。
来自 jQuery 源代码:
isPlainObject: function( obj ) {
var key;
// Must be an Object.
// Because of IE, we also have to check the presence of the constructor property.
// Make sure that DOM nodes and window objects don't pass through, as well
if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
return false;
}
try {
// Not own constructor property must be Object
if ( obj.constructor &&
!core_hasOwn.call(obj, "constructor") &&
!core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
return false;
}
} catch ( e ) {
// IE8,9 Will throw exceptions on certain host objects #9897
return false;
}
// Support: IE<9
// Handle iteration over inherited properties before own properties.
if ( jQuery.support.ownLast ) {
for ( key in obj ) {
return core_hasOwn.call( obj, key );
}
}
// Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own.
for ( key in obj ) {}
return key === undefined || core_hasOwn.call( obj, key );
},