Decoratore angolare senza oggetti.DefineProperty
-
24-12-2019 - |
Domanda
Come posso usare Decorars senza avere accesso a oggetti.DefineProperty?
Sto guardando negli spessori disponibili:
Ma nel caso in cui quei non passano test, c'è un altro modo decorativo doveva lavorare?
Sto usando il decoratore per $ Onrootscope .
Sto usando Angular 1.08.Ho bisogno di compatibilità con IE7.
Aggiornamento
Ho provato alcuni metodi che sembrano funzionare, ma non conosco la differenza tra loro: 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';
});
.
Grazie.
Soluzione
Bene, una soluzione equivalente per il Pice of Code che hai condiviso è:
var proto = Object.getPrototypeOf(Object.getPrototypeOf($delegate));
proto['$onRootScope'] = function (name, listener) {
var unsubscribe = $delegate.$on(name, listener);
this.$on('$destroy', unsubscribe);
};
.
Nel codice originale questa linea $delegate.constructor.prototype
riceve l'accesso al prototipo del prototipo di $ Delegate.
Allora, una volta raggiunto l'accesso ad esso, puoi semplicemente definire una nuova funzione in esso.Non è necessario utilizzare defineProperty
.L'unico avvertimento è che utilizzando defineProperty
è possibile configurare che il metodo non è enumerabile (non dovrebbe essere visualizzato per-ciascun loop).In questo altro modo, il metodo aggiunto apparirebbe in per-ciascun loop.Potrebbe non essere un problema per te.
Ho creato un jsfiddle per questo.
è possibile utilizzare Polyfill di John Resig per getObjectPrototypeOf
if La funzione non è disponibile per il tuo browser corrente: .
..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; }; } }