كيف يمكنني إضافة خاصية كائن إلى الكائن العمومي في Rhino JavaScript
-
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();
تحرير: لعنة عرف أنه سيكون الصيد! اقتراح الأميال سيكون الذهاب في هذه الحالة.