質問

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';
});
.

ありがとうございました。

役に立ちましたか?

解決

well、あなたが共有したコードのパイカへの同等の解決策は次のとおりです。

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は$ Delegateのプロトタイププロトタイプにアクセスしています。

その後、アクセスを取得すると、新しい機能を単に定義することができます。definePropertyを使用する必要はありません。唯一の警告は、definePropertyを使用することによって、メソッドが列挙されていないことを構成できます(各ループには表示されません)。このように、追加された方法は各ループに表示されます。それはあなたにとって問題ないかもしれません。

私は jsfiddle を作成しました。

John ResigのPolyfill 現在のブラウザには使用できません:

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;
    };
  }
}
.
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top