【问题标题】:Object Prototype Function Breaking in jQueryjQuery中的对象原型函数中断
【发布时间】:2017-03-02 19:14:30
【问题描述】:

有人帮我设计了一个很棒的 JavaScript 对象原型,但它在 jQuery 中被破坏了。在 jQuery 中它给出了一个错误:

jquery.min.js:2 Uncaught TypeError: V[g].exec is not a function

我发现 Object.defineProperty 块(如下)停止了 jQuery 错误。但它不起作用。当我调用 multiparter() 时,它只返回“未定义”。谁能帮忙解决一下?

Object.prototype.multiparter = function(route) {
    var newObj = this;
    route.forEach(function(key) {
        newObj = newObj[key]
    });
    return newObj;
};

Object.defineProperty(Object.prototype, 'multiparter',{
    value : function() {},
    enumerable : false
});

var mekBldr = {
    mecha: {
        heads: {
            head01: {
                cost: 0,
                classification: ''
            }
        },
        rightLimbs: {
            legs: {
                rightleg01: {
                    cost: 0,
                    classification: ''
                }
            }
        },
        leftLimbs: {
            legs: {
                leftleg01: {
                    cost: 0,
                    classification: ''
                }
            }
        }
    }
};
var part = 'heads';
var stuck2 = [part];
var part1 = 'leftLimbs';
var part2 = 'legs';
var stuck = [part1, part2];
mekBldr.mecha.multiparter(stuck2).head01.cost = 2;
//goal: mekBldr.mecha.leftLimbs.legs.leftleg01.cost = 5;
mekBldr.mecha.multiparter(stuck).leftleg01.cost = 5;

【问题讨论】:

    标签: javascript jquery object prototype


    【解决方案1】:

    通过将value 传递给描述符,您只是用那个空函数覆盖了该方法(即什么都不做并返回undefined)。如果你真的想define a method on Object.prototype(你绝对不应该这样做),你需要使用

    Object.defineProperty(Object.prototype, 'multiparter', {
        value: function(route) {
            return route.reduce(function(newObj, key) {
                return newObj[key]
            }, this);
        },
        enumerable: false,
        configurable: true
    });
    

    【讨论】:

    • 感谢您的信息。听起来我不应该通过使用 Object.prototype 来解决我的问题。什么是更好的解决方案?在上面我的代码示例的底部,您可以看到“目标”。这就是我想要完成的。任何帮助将不胜感激。
    • 使其成为静态函数:multiparter(mekBldr.mecha, stuck2).head01.cost 不是方法。有一天,您会遇到一个拥有自己的 multiparter 属性的对象,而您的代码会中断。
    • 喜欢这个? codefunction multiparter(theObj,route) { route.forEach(function (key) { theObj = theObj[key] });返回对象; }code
    • @user1592980 是的,完全正确。虽然我建议使用reduce 而不是forEach 就像我的回答一样:-)
    猜你喜欢
    • 1970-01-01
    • 2015-06-19
    • 2016-03-03
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多