كيف يمكنني إضافة خاصية كائن إلى الكائن العمومي في Rhino JavaScript

StackOverflow https://stackoverflow.com/questions/1162998

  •  18-09-2019
  •  | 
  •  

سؤال

لدي بعض الخصائص في كائن أرغب في إضافته إلى مساحة الاسم العالمية. في جافا سكريبت على المتصفح، يمكنني فقط إضافته إلى window كائن مثل ذلك:

var myObject = {
  foo : function() {
    alert("hi");
  }
  // and many more properties
};

for (property in myObject) {
  window[property] = myObject[property];
}

// now I can just call foo()
foo();

ولكن بما أن وحيد القرن ليس لديه كائن النافذة العالمية لا أستطيع فعل ذلك. هل هناك كائن معادل أو طريقة أخرى لإنجاز هذا؟

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

المحلول

يمكنك استخدام this, والذي يشير إلى الكائن العالمي إذا لم يتم استدعاء الوظيفة الحالية كطريقة كائن.

نصائح أخرى

لقد وجدت حل رائع إلى حد ما في nczonline.:

function getGlobal(){
  return (function(){
    return this;
    }).call(null);
}

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

اتصل باستخدام:

var glob = getGlobal();

glob سوف ثم العودة [object global] في وحيد القرن.

إليك كيف فعلت ذلك في الماضي:

// Rhino setup
Context jsContext = Context.enter();
Scriptable globalScope = jsContext.initStandardObjects();

// Define global variable
Object globalVarValue = "my value";
globalScope.put("globalVarName", globalScope, globalVarValue);

هل يمكن أن تحدد بنفسك window كائن كمتغير المستوى الأعلى:

var window = {};

يمكنك بعد ذلك تعيين القيم إليه كما تريد. (window"ربما ليس أفضل اسم متغير في هذا الموقف، على الرغم من ذلك.)

أنظر أيضا: هل يمكنني إنشاء كائن "نافذة" يعمل بجهاز JavaScript في محرك نصي Rhino Java6

أنا لم أستخدم وحيد القرن ولكن لم أستطع فقط استخدام var؟

بمعنى آخر


var foo = myObject.foo;
foo();

تحرير: لعنة عرف أنه سيكون الصيد! اقتراح الأميال سيكون الذهاب في هذه الحالة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top