0

object.defineProperty에 액세스하지 않고 데코레이터를 사용하려면 어떻게해야합니까?object.defineProperty가없는 AngularJS Decorator

내가 사용할 수있는 심으로 찾고 있어요 :

하지만 경우에 그

이 테스트를 통과하지 못한, 장식이 작동하도록 한 또 다른 방법은 무엇입니까?

$onRootScope에 데코레이터를 사용하고 있습니다.

각도 1.08을 사용 중입니다. IE7과의 호환성이 필요합니다.

업데이트

나는 제대로 작동 몇 가지 방법을 시도했지만 나는 그들 사이의 차이를 모르는 :

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

plunkr 당신을 감사드립니다.

+1

: 함수는 현재 브라우저를 사용할 수없는 경우

당신은 getObjectPrototypeOf에 대한 John Resig's polyfill을 사용할 수 있습니다 $ onRootScope에 데코레이터를 만드시겠습니까? –

+0

@EdwinDalorzo 이미 질문이 있습니다. 필자는 $ onRootScope를 정의하는 방법에 대한 대답을 언급했으며'object.defineProperty()'를 사용합니다. 내가 찾은 다른 예제들도 이것을 사용합니다. 'object.defineProperty()'를 사용하지 않는 예제가 있습니까? –

답변

0

글쎄, 당신이 공유 코드의 파이스 동전에 상응하는 솔루션입니다 :이 줄 $delegate.constructor.prototype은 $ 위임의 프로토 타입 프로토 타입에 대한 액세스를지고 원래의 코드에서

var proto = Object.getPrototypeOf(Object.getPrototypeOf($delegate)); 
proto['$onRootScope'] = function (name, listener) { 
    var unsubscribe = $delegate.$on(name, listener); 
    this.$on('$destroy', unsubscribe); 
}; 

.

그런 다음 액세스 권한을 얻으면 간단히 새 기능을 정의 할 수 있습니다. defineProperty을 사용할 필요가 없습니다. 유일한주의 사항은 defineProperty을 사용하여 메서드를 열거 할 수 없도록 구성 할 수 있다는 것입니다 (for-each 루프에는 나타나지 않아야 함). 이 다른 방법으로 추가 된 메서드는 for-each 루프에 나타납니다. 그래도 문제가되지 않을 수도 있습니다.

나는 이것을 위해 JSFiddle을 만들었습니다. 요 당신은 당신이 Object.defineProperty을 사용하여 강제로 생각하는 이유에 대한 예제를 줄 수

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; 
    }; 
    } 
} 
+0

아쉽게도이 문제는 'object.defineProperty'와 동일한 [호환성 문제] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getPrototypeOf)로 인해 발생합니다. 그러나'$ onRootScope' 메소드를 제공하기 위해 간단한 함수 할당을 사용했다는 것이 흥미 롭습니다. 프로토 타입을 얻으려면, 그냥'$ delegate.prototype.prototype' 또는'$ delegate.constructor.prototype.constructor.prototype' 또는 뭔가를 할 수 있을까요? –

+0

아니면 그냥 $ delgate.constructor.prototype = {value : ...}'을 할 수 있습니까? –

+0

@ ogc-nick getPrototypeOf의 구현을 위해 [John Resig 's polyfill] (http://ejohn.org/blog/objectgetprototypeof/)을 사용할 수 있습니다. 나는 나의 대답을 편집했다. –