Как использовать JavaScript получить и установить для polyfill - PullRequest
1 голос
/ 31 января 2012

Я пытаюсь выяснить, как сделать полифилл для набора данных , и я думаю, что мне нужно использовать get и set для определения функции. Как будет выглядеть синтаксис get / set при попытке добавить их к Element.prototype? В примерах на MDN показаны локальные переменные, но как их использовать для добавления к Element.prototype?

Object.defineProperty {Element.prototype, "dataset", 
   get: function() { /* return value */ }
 , set: function(newVal) { /* set somehow w/ setAttribute or jQuery */ }
}

Я бы хотел либо перенаправить методы getter / setter на $. Attr () В приведенном выше примере я просто связал их с .data () или (лучше) с родной setAttribute и getAttribute. Здесь есть один полифилл для набора данных , но он поддерживает только совместимые со стандартами браузеры (не IE8 или менее). Я хочу сделать один из них избегает использования __defineGetter__ (я думаю, что это проблема в IE8). Я думаю, что defineProperty может быть подходящим методом, и я могу использовать ES5 Shim , чтобы его заполнить. Как бы я использовал defineProperty , чтобы сделать это?

1 Ответ

2 голосов
/ 17 ноября 2012

Да, Object.defineProperty работает там, где доступно. Я сделал такой полифилл на основе оригинала Эли Грэя, немного улучшив его, избегая переопределения глобальных / нестандартных прототипов и правильно работая с CamelCasing (и используя его полифилл Xccessors, где поддерживается defineProperty отсутствует).

Обновление: Хотя в данном случае это не имеет значения, я могу упомянуть, что полифилл defineProperty будет работать только в IE8 на объектах DOM. И он не будет работать до IE8, потому что никто не может переопределить прототипы DOM до этого - если вы действительно не хотите испачкать руки и построить свой собственный , но тщательное выполнение этого было бы огромной задачей. Кроме того, dataset полифилы (мои и оригинальные) в настоящее время работают только для полифилла, стандартным образом для считывания свойств из Element.prototype.getAttribute() и работы оттуда. Element.prototype.getAttribute также потребуется полизаполнение, чтобы обеспечить получение последней обновленной версии набора данных и т. Д.

...