Object.DefinePropertyのないAngularJSデコレータ
-
24-12-2019 - |
質問
Object.DefinePropertyにアクセスすることなくデコレータを使用する方法?
私は利用可能なシムを探しています:
しかし、それらがテストを通過しない場合は、別の方法が働くことを意図していた方法がありましたか?
。私は仕事をしているように見えるかどうかを試みましたが、それらの間の違いはわかりません: 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; }; } }
所属していません StackOverflow