IE8对象预期错误

时间:2013-09-12 09:58:03

标签: javascript internet-explorer internet-explorer-8 prototype

我正在尝试创建一个像backbone.js一样的原型扩展系统。

我有以下代码:

var _ = {

    /**
     * Applies a function to each property in an object.
     *
     * @public
     * @param {Object} obj - Object to loop through.
     * @param {Function} callback - Callback to pass each property to.
     * @param {*} [context] - Optionally set the context for the callback function.
     */
    each: function (obj, callback, context) {
        context = context || null;
        if (obj.length) {
            for (var i = 0; i < obj.length; i++) {
                callback.call(context, obj[i], i);
            }
        } else {
            for (var prop in obj) {
                if (_.has(obj, prop)) {
                    callback.call(context, obj[prop], prop);
                }
            }
        }
    },

    /**
     * Takes properties from any number of objects and passes them to the first, properties of objects later in the arguments list take precedence.
     *
     * @public
     * @param {Object} source - Object to recieve properties.
     * @param {...Object} Zero or more objects to steal properties from
     * @returns {Boolean}
     */
    extend: function (source) {
        var count = arguments.length;
        var i = 1;
        while (i < count) {
            var obj = arguments[i];
            _.each(obj, function (prop, key) {
                source[key] = prop;
            });
            i++;
        }
        return source
    },

    /**
     * Safely checks if object has a property incase the object's hasOwnProperty property gets overwritten.
     *
     * @public
     * @param {Object} obj - Object to test.
     * @param {String} prop - Property name to test.
     * @returns {Boolean}
     */
    has: function (obj, prop) {
        return Object.prototype.hasOwnProperty.call(obj, prop);
    }
}

var View = function(opts) {
    _.extend(this, opts);
}

View.prototype = {
    init: function() {},

    render: function() {
        return this;
    }
}

View.extend = function(proto) {
    var parent = this;

    // Proxy the parent's constructor
    var child = function() { return parent.apply(this, arguments); };
    child.prototype = Object.create(parent.prototype);
    _.extend(child.prototype, proto);

    child.extend = View.extend;
    return child;
}

if (!Object.create) {
    Object.create = (function(){
        function F(){}

        return function(o){
            F.prototype = o;
            return new F()
        }
    })()
}

var ExtendedView = View.extend({
    foo: function() {
        console.log(this.message);
    }
});

var bar = new ExtendedView({message: "hello"}).render().foo();

这在大多数浏览器中都可以正常工作,但IE8会在以下行引发Object expected错误:

var bar = new ExtendedView({message: "hello"}).render().foo();

它没有给我任何比这更有用的信息......谁能告诉我为什么会这样?

1 个答案:

答案 0 :(得分:1)