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.

È stato utile?

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 getObjectPrototypeOfif 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;
    };
  }
}
.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top