AngularJS Decorator без object.defineProperty
Как использовать декораторы без доступа к object.defineProperty?
Я ищу доступные прокладки:
но если они не проходят тестирование, есть ли другой способ декораторов работать?
Я использую декоратор для $ onRootScope.
Я использую угловой 1.08. Мне нужна совместимость с IE7.
Обновить
Я опробовал несколько методов, которые, кажется, работают, но я не знаю разницу между ними: plunkr
var app = angular.module('plunker', []);
app.config(['$provide', function($provide){
$provide.decorator('$rootScope', ['$delegate', function($delegate){
$delegate.a = 1;
$delegate.constructor.prototype.b = 2;
Object.defineProperty($delegate.constructor.prototype, 'c', {
value: 3
});
return $delegate;
}]);
}]);
app.controller('MainCtrl', function($rootScope, $scope) {
console.log($rootScope); //reveals `a` property
console.log($rootScope.constructor.prototype); //=> {b:2, c:3}
console.log($rootScope.a); //=> 1
console.log($rootScope.b); //=> 2
console.log($rootScope.c); //=> 3
$scope.name = 'World';
});
Благодарю вас.
1 ответ
Что ж, эквивалентное решение части кода, которой вы поделились:
var proto = Object.getPrototypeOf(Object.getPrototypeOf($delegate));
proto['$onRootScope'] = function (name, listener) {
var unsubscribe = $delegate.$on(name, listener);
this.$on('$destroy', unsubscribe);
};
В оригинальном коде эта строка $delegate.constructor.prototype
получает доступ к прототипу $ делегата.
Затем, как только вы получите к нему доступ, вы можете просто определить в нем новую функцию. Вам не нужно использовать defineProperty
, Единственное предостережение заключается в том, что с помощью defineProperty
вы можете настроить, чтобы метод не перечислим (не должен появляться в циклах for-each). Таким образом, добавленный метод появится в циклах for-each. Это не может быть проблемой для вас, хотя.
Я создал JSFiddle для этого.
Вы можете использовать полифилл Джона Резига для getObjectPrototypeOf
если функция недоступна для вашего текущего браузера:
if ( typeof Object.getPrototypeOf !== "function" ) { if ( typeof "test".__proto__ === "object" ) { Object.getPrototypeOf = function(object){ return object.__proto__; }; } else { Object.getPrototypeOf = function(object){ // May break if the constructor has been tampered with return object.constructor.prototype; }; } }