2016-10-20 4 views
0

Кто-то помог мне с отличным прототипом объекта для JavaScript, но он разбивается на jQuery. В JQuery он дает ошибку:Функция прототипа объекта Ломать в jQuery

jquery.min.js: 2 Uncaught TypeError: V [г] .exec не является функцией

я обнаружил, что блок Object.defineProperty (ниже) останавливает ошибку JQuery , Но тогда это не сработает. Когда я вызываю multipater(), он просто возвращает «undefined». Может ли кто-нибудь помочь с решением?

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; 

ответ

0

Передавая 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 
}); 
+0

Спасибо за информацию. Похоже, я не должен решать свою проблему, используя Object.prototype. Что является лучшим решением? В нижней части моего примера кода вы можете увидеть «цель». Это то, чего я пытаюсь выполнить. Любая помощь будет принята с благодарностью. – user1592980

+0

Сделать это статической функцией: 'multiparter (mekBldr.mecha, stuck2) .head01.cost' не метод. Однажды вы столкнетесь с объектом, у которого есть свое свойство 'multiparter', и ваш код сломается. – Bergi

+0

Нравится? 'code'function multiparter (theObj, route) { route.forEach (функция (ключ) { theObj = theObj [ключ] }); return theObj; } 'code' – user1592980

Смежные вопросы