0

这是否:

function isplainobj ( obj ) {
    return Object.prototype.toString.call( obj ) === "[object Object]";
}

做和 jQuery 一样的事情: $.isPlainObject() ?

4

4 回答 4

2

这个简单的测试应该可以做到

  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
});
于 2014-05-03T07:16:59.660 回答
2

不,它没有。

这是它的实现:

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。

于 2013-08-30T11:35:50.030 回答
2

根据这里的 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;
    }

对象不应该有自己的属性constructorobj.constructor.prototype也不应该isPrototypeOf确保它不在原型链中。请查看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isPrototypeOf了解更多信息。

于 2013-08-30T11:39:23.843 回答
0

来自 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 );
},
于 2013-08-30T11:35:13.967 回答