سؤال

كيف يمكنني استخدام الديكور دون الوصول إلى الكائن.ديفينيبروبيرتي?

أنا أبحث في الحشوات المتاحة:

ولكن في حالة عدم اجتياز الاختبار, هل هناك طريقة أخرى كان من المفترض أن يعمل بها المصممون?

أنا باستخدام الديكور ل on منظار الجذور.

أنا باستخدام الزاوي 1.08.أحتاج التوافق مع إي 7.

تحديث

لقد جربت بعض الطرق التي يبدو أنها تعمل ولكني لا أعرف الفرق بينهما: بلونكر

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

يعطيكم الصّحة.

هل كانت مفيدة؟

المحلول

حسنا ، حل مكافئ ل بيس من التعليمات البرمجية التي شاركتها هو:

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 هو الحصول على الوصول إلى النموذج الأولي للمندوب.

بعد ذلك ، بمجرد الوصول إليها ، يمكنك ببساطة تحديد وظيفة جديدة فيها.لا تحتاج إلى استخدام defineProperty.التحذير الوحيد هو أنه باستخدام defineProperty يمكنك تكوين أن الأسلوب غير قابل للعد (يجب أن لا تظهر في ل-كل الحلقات).بهذه الطريقة الأخرى ، ستظهر الطريقة المضافة في كل حلقة.قد لا يكون مشكلة بالنسبة لك على الرغم من.

لقد خلقت جسفيدل لهذا.

يمكنك استخدام بوليفيل جون ريسيج ل getObjectPrototypeOfإذا كانت الوظيفة غير متوفرة لمتصفحك الحالي:

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