0

現在使用中:

function isObjLiteral(_obj) {
  var _test  = _obj;
  return (  typeof _obj !== 'object' || _obj === null ?
     false :  (
        (function () {
           while (!false) {
              if (  Object.getPrototypeOf( _test = Object.getPrototypeOf(_test)  ) === null) {
                 break;
              }
           }
           return Object.getPrototypeOf(_obj) === _test;
        })()
     )
  );

}

オブジェクトリテラルを使用しているかどうかをテストします。問題は、IE8 < が使用できないことgetPrototypeOfです。簡単な回避策を知っている人はいますか?

4

1 に答える 1

2

この回避策の改善:

if (typeof Object.getPrototypeOf !== "function")
    Object.getPrototypeOf = "".__proto__ === String.prototype
      ? function (obj) {
            if (obj !== Object(obj)) throw new TypeError("object please!");
            return obj.__proto__;
        }
      : function (obj) {
            if (obj !== Object(obj)) throw new TypeError("object please!");
            // May break if the constructor has been tampered with
            var proto = obj.constructor && obj.constructor.prototype;
            if (proto === obj) { // happens on prototype objects for example
                var cons = obj.constructor;
                delete obj.constructor;
                proto = obj.constructor && obj.constructor.prototype;
                obj.constructor = cons;
            }
            // if (proto === obj) return null; // something else went wrong
            return proto;
        };

テストはしていませんが、ほとんどの場合、IE8 でも動作するはずです。ところで、あなたisObjLiteralは単純化できるようです

function isPlainObject(obj) {
    if (obj !== Object(obj)) return false;
    var proto = Object.getPrototypeOf(obj);
    return !!proto && !Object.getPrototypeOf(proto);
}
于 2013-07-15T17:14:47.777 に答える