V8 রানটাইমে স্ক্রিপ্ট স্থানান্তর করা হচ্ছে

আপনার যদি Rhino রানটাইম ব্যবহার করে একটি বিদ্যমান স্ক্রিপ্ট থাকে এবং আপনি V8 সিনট্যাক্স এবং বৈশিষ্ট্যগুলি ব্যবহার করতে চান তবে আপনাকে অবশ্যই স্ক্রিপ্টটি V8 এ স্থানান্তর করতে হবে।

Rhino রানটাইম ব্যবহার করে লেখা বেশিরভাগ স্ক্রিপ্ট সমন্বয় ছাড়াই V8 রানটাইম ব্যবহার করে কাজ করতে পারে। প্রায়শই একটি স্ক্রিপ্টে V8 সিনট্যাক্স এবং বৈশিষ্ট্য যোগ করার একমাত্র পূর্বশর্ত হল V8 রানটাইম সক্রিয় করা

যাইহোক, অসঙ্গতি এবং অন্যান্য পার্থক্যের একটি ছোট সেট রয়েছে যার ফলে একটি স্ক্রিপ্ট ব্যর্থ হতে পারে বা V8 রানটাইম সক্ষম করার পরে অপ্রত্যাশিতভাবে আচরণ করতে পারে। V8 ব্যবহার করার জন্য আপনি একটি স্ক্রিপ্ট স্থানান্তর করার সময়, আপনাকে অবশ্যই এই সমস্যাগুলির জন্য স্ক্রিপ্ট প্রকল্পটি অনুসন্ধান করতে হবে এবং আপনি যে কোনোটি খুঁজে পাবেন তা সংশোধন করতে হবে।

V8 মাইগ্রেশন পদ্ধতি

V8 এ একটি স্ক্রিপ্ট স্থানান্তর করতে, এই পদ্ধতিটি অনুসরণ করুন:

  1. স্ক্রিপ্টের জন্য V8 রানটাইম সক্ষম করুন
  2. নীচে তালিকাভুক্ত অসঙ্গতিগুলি সাবধানতার সাথে পর্যালোচনা করুন। কোনো অসঙ্গতি আছে কিনা তা নির্ধারণ করতে আপনার স্ক্রিপ্ট পরীক্ষা করুন; এক বা একাধিক অসঙ্গতি উপস্থিত থাকলে, সমস্যাটি সরাতে বা এড়াতে আপনার স্ক্রিপ্ট কোড সামঞ্জস্য করুন।
  3. নীচে তালিকাভুক্ত অন্যান্য পার্থক্যগুলি সাবধানতার সাথে পর্যালোচনা করুন। তালিকাভুক্ত কোনো পার্থক্য আপনার কোডের আচরণকে প্রভাবিত করে কিনা তা নির্ধারণ করতে আপনার স্ক্রিপ্ট পরীক্ষা করুন। আচরণ সংশোধন করতে আপনার স্ক্রিপ্ট সামঞ্জস্য করুন.
  4. একবার আপনি কোনো আবিষ্কৃত অসঙ্গতি বা অন্যান্য পার্থক্য সংশোধন করে ফেললে, আপনি V8 সিনট্যাক্স এবং অন্যান্য বৈশিষ্ট্যগুলিকে ইচ্ছামতো ব্যবহার করতে আপনার কোড আপডেট করা শুরু করতে পারেন।
  5. আপনার কোড সামঞ্জস্য শেষ করার পরে, আপনার স্ক্রিপ্টটি প্রত্যাশিতভাবে আচরণ করছে তা নিশ্চিত করতে পুঙ্খানুপুঙ্খভাবে পরীক্ষা করুন।
  6. যদি আপনার স্ক্রিপ্ট একটি ওয়েব অ্যাপ বা প্রকাশিত অ্যাড-অন হয়, তাহলে আপনাকে অবশ্যই V8 সমন্বয় সহ স্ক্রিপ্টের একটি নতুন সংস্করণ তৈরি করতে হবে। V8 সংস্করণ ব্যবহারকারীদের জন্য উপলব্ধ করতে, আপনাকে এই সংস্করণের সাথে স্ক্রিপ্টটি পুনরায় প্রকাশ করতে হবে।

অসঙ্গতি

আসল Rhino-ভিত্তিক Apps Script রানটাইম দুর্ভাগ্যবশত বেশ কিছু অ-মানক ECMAScript আচরণের অনুমতি দিয়েছে। যেহেতু V8 মান সম্মত, তাই এই আচরণগুলি মাইগ্রেশনের পরে সমর্থিত নয়৷ একবার V8 রানটাইম সক্ষম হয়ে গেলে এই সমস্যাগুলি সংশোধন করতে ব্যর্থ হলে ত্রুটি বা ভাঙা স্ক্রিপ্ট আচরণের ফলাফল।

V8 এ মাইগ্রেশন করার সময় আপনার স্ক্রিপ্ট কোড সংশোধন করার জন্য নিম্নলিখিত বিভাগগুলি এই প্রতিটি আচরণ এবং পদক্ষেপগুলি বর্ণনা করে।

for each(variable in object)

for each (variable in object) বিবৃতিটি জাভাস্ক্রিপ্ট 1.6-এ যোগ করা হয়েছে এবং for...of পক্ষে সরানো হয়েছে।

V8 এ আপনার স্ক্রিপ্ট স্থানান্তর করার সময়, for each (variable in object) ব্যবহার করা এড়িয়ে চলুন।

পরিবর্তে, for (variable in object) ব্যবহার করুন:

// Rhino runtime
var obj = {a: 1, b: 2, c: 3};

// Don't use 'for each' in V8
for each (var value in obj) {
  Logger.log("value = %s", value);
}
      
// V8 runtime
var obj = {a: 1, b: 2, c: 3};

for (var key in obj) {  // OK in V8
  var value = obj[key];
  Logger.log("value = %s", value);
}
      

Date.prototype.getYear() এড়িয়ে চলুন

আসল Rhino রানটাইমে, Date.prototype.getYear() 1900-1999 সাল পর্যন্ত দুই-সংখ্যার বছর প্রদান করে, কিন্তু অন্যান্য তারিখের জন্য চার-অঙ্কের বছর, যা JavaScript 1.2 এবং তার আগের আচরণ ছিল।

V8 রানটাইমে, Date.prototype.getYear() ECMAScript স্ট্যান্ডার্ডের প্রয়োজন অনুসারে বছর মাইনাস 1900 প্রদান করে।

V8 এ আপনার স্ক্রিপ্ট স্থানান্তর করার সময়, সর্বদা Date.prototype.getFullYear() ব্যবহার করুন , যা তারিখ নির্বিশেষে একটি চার-সংখ্যার বছর প্রদান করে।

নাম হিসাবে সংরক্ষিত কীওয়ার্ড ব্যবহার করা এড়িয়ে চলুন

ECMAScript ফাংশন এবং পরিবর্তনশীল নামের নির্দিষ্ট সংরক্ষিত কীওয়ার্ড ব্যবহার নিষিদ্ধ করে। Rhino রানটাইম এই শব্দগুলির অনেকগুলিকে অনুমতি দেয়, তাই যদি আপনার কোড সেগুলি ব্যবহার করে তবে আপনাকে অবশ্যই আপনার ফাংশন বা ভেরিয়েবলের নাম পরিবর্তন করতে হবে।

V8 এ আপনার স্ক্রিপ্ট স্থানান্তর করার সময়, সংরক্ষিত কীওয়ার্ডগুলির একটি ব্যবহার করে ভেরিয়েবল বা ফাংশনের নামকরণ এড়িয়ে চলুন । কীওয়ার্ড নাম ব্যবহার এড়াতে কোনো ভেরিয়েবল বা ফাংশনের নাম পরিবর্তন করুন। নাম হিসাবে কীওয়ার্ডের সাধারণ ব্যবহার হল class , import এবং export

const ভেরিয়েবল পুনরায় বরাদ্দ করা এড়িয়ে চলুন

মূল Rhino রানটাইমে, আপনি const ব্যবহার করে একটি ভেরিয়েবল ঘোষণা করতে পারেন যার অর্থ প্রতীকের মান কখনই পরিবর্তিত হয় না এবং প্রতীকের ভবিষ্যতের অ্যাসাইনমেন্ট উপেক্ষা করা হয়।

নতুন V8 রানটাইমে, const কীওয়ার্ডটি মানসম্মত এবং const হিসাবে ঘোষিত একটি ভেরিয়েবলকে অ্যাসাইন করার ফলে একটি TypeError: Assignment to constant variable রানটাইম ত্রুটি দেখা দেয়।

আপনার স্ক্রিপ্ট V8 এ স্থানান্তরিত করার সময়, একটি const ভেরিয়েবলের মান পুনরায় বরাদ্দ করার চেষ্টা করবেন না :

// Rhino runtime
const x = 1;
x = 2;          // No error
console.log(x); // Outputs 1
      
// V8 runtime
const x = 1;
x = 2;          // Throws TypeError
console.log(x); // Never executed
      

XML আক্ষরিক এবং XML অবজেক্ট এড়িয়ে চলুন

ECMAScript-এ এই অ-মানক এক্সটেনশনটি অ্যাপস স্ক্রিপ্ট প্রকল্পগুলিকে সরাসরি XML সিনট্যাক্স ব্যবহার করতে দেয়।

V8 এ আপনার স্ক্রিপ্ট স্থানান্তর করার সময়, সরাসরি XML লিটারাল বা XML অবজেক্ট ব্যবহার করা এড়িয়ে চলুন

পরিবর্তে, XML পার্স করতে XmlService ব্যবহার করুন:

// V8 runtime
var incompatibleXml1 = <container><item/></container>;             // Don't use
var incompatibleXml2 = new XML('<container><item/></container>');  // Don't use

var xml3 = XmlService.parse('<container><item/></container>');     // OK
      

__iterator__ ব্যবহার করে কাস্টম ইটারেটর ফাংশন তৈরি করবেন না

জাভাস্ক্রিপ্ট 1.7 একটি বৈশিষ্ট্য যুক্ত করেছে যাতে ক্লাসের প্রোটোটাইপে একটি __iterator__ ফাংশন ঘোষণা করে যেকোনো ক্লাসে একটি কাস্টম ইটারেটর যোগ করার অনুমতি দেওয়া হয়; এটি ডেভেলপারের সুবিধা হিসেবে অ্যাপস স্ক্রিপ্টের রাইনো রানটাইমে যোগ করা হয়েছে। যাইহোক, এই বৈশিষ্ট্যটি কখনই ECMA-262 স্ট্যান্ডার্ডের অংশ ছিল না এবং ECMAScript-সঙ্গত জাভাস্ক্রিপ্ট ইঞ্জিনগুলিতে সরানো হয়েছিল। V8 ব্যবহার করে স্ক্রিপ্টগুলি এই পুনরাবৃত্তিকারী নির্মাণ ব্যবহার করতে পারে না।

V8 এ আপনার স্ক্রিপ্ট স্থানান্তর করার সময়, কাস্টম ইটারেটর তৈরি করতে __iterator__ ফাংশন এড়িয়ে চলুন । পরিবর্তে, ECMAScript 6 পুনরাবৃত্তিকারী ব্যবহার করুন।

নিম্নলিখিত অ্যারে নির্মাণ বিবেচনা করুন:

// Create a sample array
var myArray = ['a', 'b', 'c'];
// Add a property to the array
myArray.foo = 'bar';

// The default behavior for an array is to return keys of all properties,
//  including 'foo'.
Logger.log("Normal for...in loop:");
for (var item in myArray) {
  Logger.log(item);            // Logs 0, 1, 2, foo
}

// To only log the array values with `for..in`, a custom iterator can be used.
      

নিম্নলিখিত কোড উদাহরণগুলি দেখায় যে কীভাবে রাইনো রানটাইমে একটি ইটারেটর তৈরি করা যেতে পারে এবং কীভাবে V8 রানটাইমে একটি প্রতিস্থাপন পুনরাবৃত্তিকারী তৈরি করা যায়:

// Rhino runtime custom iterator
function ArrayIterator(array) {
  this.array = array;
  this.currentIndex = 0;
}

ArrayIterator.prototype.next = function() {
  if (this.currentIndex
      >= this.array.length) {
    throw StopIteration;
  }
  return "[" + this.currentIndex
    + "]=" + this.array[this.currentIndex++];
};

// Direct myArray to use the custom iterator
myArray.__iterator__ = function() {
  return new ArrayIterator(this);
}


Logger.log("With custom Rhino iterator:");
for (var item in myArray) {
  // Logs [0]=a, [1]=b, [2]=c
  Logger.log(item);
}
      
// V8 runtime (ECMAScript 6) custom iterator
myArray[Symbol.iterator] = function() {
  var currentIndex = 0;
  var array = this;

  return {
    next: function() {
      if (currentIndex < array.length) {
        return {
          value: "[${currentIndex}]="
            + array[currentIndex++],
          done: false};
      } else {
        return {done: true};
      }
    }
  };
}

Logger.log("With V8 custom iterator:");
// Must use for...of since
//   for...in doesn't expect an iterable.
for (var item of myArray) {
  // Logs [0]=a, [1]=b, [2]=c
  Logger.log(item);
}
      

শর্তাধীন ক্যাচ ক্লজ এড়িয়ে চলুন

V8 রানটাইম catch..if সমর্থন করে না।

V8 এ আপনার স্ক্রিপ্ট স্থানান্তর করার সময়, ক্যাচ বডির ভিতরে যেকোনো ক্যাচ কন্ডিশনাল সরান :

// Rhino runtime

try {
  doSomething();
} catch (e if e instanceof TypeError) {  // Don't use
  // Handle exception
}
      
// V8 runtime
try {
  doSomething();
} catch (e) {
  if (e instanceof TypeError) {
    // Handle exception
  }
}

Object.prototype.toSource() ব্যবহার করা এড়িয়ে চলুন

JavaScript 1.3-এ একটি Object.prototype.toSource() পদ্ধতি রয়েছে যা কোনো ECMAScript স্ট্যান্ডার্ডের অংশ ছিল না। এটি V8 রানটাইমে সমর্থিত নয়।

V8 এ আপনার স্ক্রিপ্ট স্থানান্তর করার সময়, আপনার কোড থেকে Object.prototype.toSource() এর যেকোনো ব্যবহার মুছে ফেলুন

অন্যান্য পার্থক্য

উপরের অসঙ্গতিগুলি ছাড়াও যা স্ক্রিপ্ট ব্যর্থতার কারণ হতে পারে, আরও কিছু পার্থক্য রয়েছে যেগুলি যদি সংশোধন না করা হয়, তাহলে অপ্রত্যাশিত V8 রানটাইম স্ক্রিপ্ট আচরণ হতে পারে।

এই অপ্রত্যাশিত বিস্ময় এড়াতে আপনার স্ক্রিপ্ট কোড কীভাবে আপডেট করবেন তা নিম্নলিখিত বিভাগগুলি ব্যাখ্যা করে৷

লোকেল-নির্দিষ্ট তারিখ এবং সময় বিন্যাস সামঞ্জস্য করুন

Date পদ্ধতি toLocaleString() , toLocaleDateString() , এবং toLocaleTimeString() V8 রানটাইমে Rhino এর তুলনায় ভিন্নভাবে আচরণ করে।

Rhino-এ, ডিফল্ট বিন্যাস হল দীর্ঘ বিন্যাস , এবং পাস করা যেকোনো পরামিতি উপেক্ষা করা হয়।

V8 রানটাইমে, ডিফল্ট ফরম্যাট হল সংক্ষিপ্ত বিন্যাস এবং পাস করা পরামিতিগুলি ECMA স্ট্যান্ডার্ড অনুযায়ী পরিচালনা করা হয় (বিশদ বিবরণের জন্য toLocaleDateString() ডকুমেন্টেশন দেখুন)।

V8 এ আপনার স্ক্রিপ্ট স্থানান্তর করার সময়, লোকেল-নির্দিষ্ট তারিখ এবং সময় পদ্ধতির আউটপুট সম্পর্কিত আপনার কোডের প্রত্যাশাগুলি পরীক্ষা করুন এবং সামঞ্জস্য করুন :

// Rhino runtime
var event = new Date(
  Date.UTC(2012, 11, 21, 12));

// Outputs "December 21, 2012" in Rhino
console.log(event.toLocaleDateString());

// Also outputs "December 21, 2012",
//  ignoring the parameters passed in.
console.log(event.toLocaleDateString(
    'de-DE',
    { year: 'numeric',
      month: 'long',
      day: 'numeric' }));
// V8 runtime
var event = new Date(
  Date.UTC(2012, 11, 21, 12));

// Outputs "12/21/2012" in V8
console.log(event.toLocaleDateString());

// Outputs "21. Dezember 2012"
console.log(event.toLocaleDateString(
    'de-DE',
    { year: 'numeric',
      month: 'long',
      day: 'numeric' }));
      

Error.fileName এবং Error.lineNumber ব্যবহার করা এড়িয়ে চলুন

V8 অসময়ে, স্ট্যান্ডার্ড জাভাস্ক্রিপ্ট Error অবজেক্ট fileName বা lineNumber কনস্ট্রাক্টর প্যারামিটার বা অবজেক্টের বৈশিষ্ট্য হিসাবে সমর্থন করে না।

V8 এ আপনার স্ক্রিপ্ট স্থানান্তর করার সময়, Error.fileName এবং Error.lineNumber এর উপর নির্ভরতা মুছে ফেলুন

একটি বিকল্প হল Error.prototype.stack ব্যবহার করা। এই স্ট্যাকটি অ-মানক, কিন্তু Rhino এবং V8 উভয় ক্ষেত্রেই সমর্থিত। দুটি প্ল্যাটফর্ম দ্বারা উত্পাদিত স্ট্যাক ট্রেসের বিন্যাসটি কিছুটা আলাদা:

// Rhino runtime Error.prototype.stack
// stack trace format
at filename:92 (innerFunction)
at filename:97 (outerFunction)
// V8 runtime Error.prototype.stack
// stack trace format
Error: error message
at innerFunction (filename:92:11)
at outerFunction (filename:97:5)
      

stringified enum বস্তুর হ্যান্ডলিং সামঞ্জস্য

মূল Rhino রানটাইমে, একটি enum অবজেক্টে JavaScript JSON.stringify() পদ্ধতি ব্যবহার করলে শুধুমাত্র {} ফেরত আসে।

V8-এ, enum অবজেক্টে একই পদ্ধতি ব্যবহার করে enum নামটি ফিরে আসে।

আপনার স্ক্রিপ্ট V8 এ স্থানান্তরিত করার সময়, enum অবজেক্টে JSON.stringify() এর আউটপুট সম্পর্কিত আপনার কোডের প্রত্যাশা পরীক্ষা করুন এবং সামঞ্জস্য করুন :

// Rhino runtime
var enumName =
  JSON.stringify(Charts.ChartType.BUBBLE);

// enumName evaluates to {}
// V8 runtime
var enumName =
  JSON.stringify(Charts.ChartType.BUBBLE);

// enumName evaluates to "BUBBLE"

অনির্ধারিত পরামিতিগুলির হ্যান্ডলিং সামঞ্জস্য করুন

মূল Rhino রানটাইমে, একটি প্যারামিটার হিসাবে একটি পদ্ধতিতে undefined পাস করার ফলে সেই পদ্ধতিতে "undefined" স্ট্রিং পাস করা হয়।

V8-এ, পদ্ধতিতে undefined পাস করা null পাস করার সমতুল্য।

V8 এ আপনার স্ক্রিপ্ট স্থানান্তর করার সময়, undefined প্যারামিটার সম্পর্কিত আপনার কোডের প্রত্যাশাগুলি পরীক্ষা করুন এবং সামঞ্জস্য করুন :

// Rhino runtime
SpreadsheetApp.getActiveRange()
    .setValue(undefined);

// The active range now has the string
// "undefined"  as its value.
      
// V8 runtime
SpreadsheetApp.getActiveRange()
    .setValue(undefined);

// The active range now has no content, as
// setValue(null) removes content from
// ranges.

বিশ্বব্যাপী this হ্যান্ডলিং সামঞ্জস্য করুন

রাইনো রানটাইম এটি ব্যবহার করে এমন স্ক্রিপ্টগুলির জন্য একটি অন্তর্নিহিত বিশেষ প্রসঙ্গ সংজ্ঞায়িত করে। স্ক্রিপ্ট কোড এই অন্তর্নিহিত প্রেক্ষাপটে চলে, this প্রকৃত বিশ্ব থেকে আলাদা। এর মানে হল যে কোডে "গ্লোবাল this " এর রেফারেন্সগুলি আসলে বিশেষ প্রসঙ্গে মূল্যায়ন করে, যা শুধুমাত্র স্ক্রিপ্টে সংজ্ঞায়িত কোড এবং ভেরিয়েবল ধারণ করে। অন্তর্নির্মিত Apps স্ক্রিপ্ট পরিষেবা এবং ECMAScript অবজেক্টগুলি this ব্যবহার থেকে বাদ দেওয়া হয়েছে৷ এই পরিস্থিতি এই জাভাস্ক্রিপ্ট গঠন অনুরূপ ছিল:

// Rhino runtime

// Apps Script built-in services defined here, in the actual global context.
var SpreadsheetApp = {
  openById: function() { ... }
  getActive: function() { ... }
  // etc.
};

function() {
  // Implicit special context; all your code goes here. If the global this
  // is referenced in your code, it only contains elements from this context.

  // Any global variables you defined.
  var x = 42;

  // Your script functions.
  function myFunction() {
    ...
  }
  // End of your code.
}();

V8 এ, অন্তর্নিহিত বিশেষ প্রসঙ্গটি সরানো হয়েছে। স্ক্রিপ্টে সংজ্ঞায়িত গ্লোবাল ভেরিয়েবল এবং ফাংশনগুলিকে বৈশ্বিক প্রেক্ষাপটে রাখা হয়, বিল্ট-ইন অ্যাপস স্ক্রিপ্ট পরিষেবা এবং ECMAScript বিল্ট-ইন যেমন Math এবং Date পাশে।

আপনার স্ক্রিপ্ট V8 এ স্থানান্তরিত করার সময়, বিশ্বব্যাপী প্রেক্ষাপটে this ব্যবহার সম্পর্কিত আপনার কোডের প্রত্যাশাগুলি পরীক্ষা করুন এবং সামঞ্জস্য করুন। বেশিরভাগ ক্ষেত্রে পার্থক্যগুলি শুধুমাত্র স্পষ্ট হয় যদি আপনার কোডটি বিশ্বব্যাপী this বস্তুর কী বা সম্পত্তির নাম পরীক্ষা করে:

// Rhino runtime
var myGlobal = 5;

function myFunction() {

  // Only logs [myFunction, myGlobal];
  console.log(Object.keys(this));

  // Only logs [myFunction, myGlobal];
  console.log(
    Object.getOwnPropertyNames(this));
}





      
// V8 runtime
var myGlobal = 5;

function myFunction() {

  // Logs an array that includes the names
  // of Apps Script services
  // (CalendarApp, GmailApp, etc.) in
  // addition to myFunction and myGlobal.
  console.log(Object.keys(this));

  // Logs an array that includes the same
  // values as above, and also includes
  // ECMAScript built-ins like Math, Date,
  // and Object.
  console.log(
    Object.getOwnPropertyNames(this));
}

লাইব্রেরিতে instanceof পরিচালনার সামঞ্জস্য করুন

একটি বস্তুর উপর একটি লাইব্রেরিতে instanceof ব্যবহার করে অন্য প্রকল্প থেকে একটি ফাংশনে একটি প্যারামিটার হিসাবে পাস করা মিথ্যা নেতিবাচক দিতে পারে। V8 রানটাইমে, একটি প্রকল্প এবং এর লাইব্রেরিগুলি বিভিন্ন এক্সিকিউশন প্রেক্ষাপটে চালিত হয় এবং তাই বিভিন্ন গ্লোবাল এবং প্রোটোটাইপ চেইন রয়েছে।

মনে রাখবেন যে এটি শুধুমাত্র তখনই হয় যদি আপনার লাইব্রেরি এমন একটি বস্তুর উপর instanceof ব্যবহার করে যা আপনার প্রকল্পে তৈরি করা হয়নি। আপনার প্রোজেক্টে তৈরি করা একটি বস্তুতে এটি ব্যবহার করা, আপনার প্রোজেক্টের ভিতরে একই বা ভিন্ন স্ক্রিপ্টে হোক, প্রত্যাশিতভাবে কাজ করা উচিত।

যদি V8 এ চলমান একটি প্রকল্প আপনার স্ক্রিপ্ট একটি লাইব্রেরি হিসাবে ব্যবহার করে, তাহলে পরীক্ষা করুন যে আপনার স্ক্রিপ্ট একটি প্যারামিটারে instanceof ব্যবহার করে যা অন্য প্রকল্প থেকে পাস করা হবে। instanceof ব্যবহার সামঞ্জস্য করুন এবং আপনার ব্যবহারের ক্ষেত্রে অন্যান্য সম্ভাব্য বিকল্পগুলি ব্যবহার করুন।

a instanceof b জন্য একটি বিকল্প হল a এর কনস্ট্রাক্টর ব্যবহার করা যেখানে আপনাকে সম্পূর্ণ প্রোটোটাইপ চেইন অনুসন্ধান করতে হবে না এবং কেবল কনস্ট্রাক্টরটি পরীক্ষা করতে হবে। ব্যবহার: a.constructor.name == "b"

প্রকল্প A এবং প্রকল্প B বিবেচনা করুন যেখানে প্রকল্প A একটি লাইব্রেরি হিসাবে প্রকল্প B ব্যবহার করে।

//Rhino runtime

//Project A

function caller() {
   var date = new Date();
   // Returns true
   return B.callee(date);
}

//Project B

function callee(date) {
   // Returns true
   return(date instanceof Date);
}

      
//V8 runtime

//Project A

function caller() {
   var date = new Date();
   // Returns false
   return B.callee(date);
}

//Project B

function callee(date) {
   // Incorrectly returns false
   return(date instanceof Date);
   // Consider using return (date.constructor.name ==
   // Date) instead.
   // return (date.constructor.name == Date) -> Returns
   // true
}

আরেকটি বিকল্প হল একটি ফাংশন প্রবর্তন করা যা মূল প্রকল্পের instanceof পরীক্ষা করে এবং একটি লাইব্রেরি ফাংশন কল করার সময় অন্যান্য পরামিতিগুলি ছাড়াও ফাংশনটি পাস করে। পাস করা ফাংশন তারপর লাইব্রেরির ভিতরে instanceof চেক করতে ব্যবহার করা যেতে পারে।

//V8 runtime

//Project A

function caller() {
   var date = new Date();
   // Returns True
   return B.callee(date, date => date instanceof Date);
}

//Project B

function callee(date, checkInstanceOf) {
  // Returns True
  return checkInstanceOf(date);
}
      

লাইব্রেরিতে অ-ভাগ করা সম্পদের পাসিং সামঞ্জস্য করুন

মূল স্ক্রিপ্ট থেকে একটি লাইব্রেরিতে একটি অ-ভাগ করা সম্পদ পাস করা V8 রানটাইমে ভিন্নভাবে কাজ করে।

Rhino রানটাইমে, একটি অ-ভাগ করা সম্পদ পাস করা কাজ করবে না। লাইব্রেরি পরিবর্তে তার নিজস্ব সম্পদ ব্যবহার করে।

V8 রানটাইমে, লাইব্রেরিতে একটি অ-ভাগ করা সম্পদ পাস করা কাজ করে। লাইব্রেরি পাস করা অ-ভাগ করা সম্পদ ব্যবহার করে।

ফাংশন প্যারামিটার হিসাবে অ-ভাগ করা সম্পদ পাস করবেন না। সবসময় একই স্ক্রিপ্টে অ-ভাগ করা সম্পদ ঘোষণা করুন যা সেগুলি ব্যবহার করে।

প্রকল্প A এবং প্রকল্প B বিবেচনা করুন যেখানে প্রকল্প A একটি লাইব্রেরি হিসাবে প্রকল্প B ব্যবহার করে। এই উদাহরণে, PropertiesService একটি অ-ভাগ করা সম্পদ।

// Rhino runtime
// Project A
function testPassingNonSharedProperties() {
  PropertiesService.getScriptProperties()
      .setProperty('project', 'Project-A');
  B.setScriptProperties();
  // Prints: Project-B
  Logger.log(B.getScriptProperties(
      PropertiesService, 'project'));
}

//Project B function setScriptProperties() { PropertiesService.getScriptProperties() .setProperty('project', 'Project-B'); } function getScriptProperties( propertiesService, key) { return propertiesService.getScriptProperties() .getProperty(key); }

// V8 runtime
// Project A
function testPassingNonSharedProperties() {
  PropertiesService.getScriptProperties()
      .setProperty('project', 'Project-A');
  B.setScriptProperties();
  // Prints: Project-A
  Logger.log(B.getScriptProperties(
      PropertiesService, 'project'));
}

// Project B function setProperties() { PropertiesService.getScriptProperties() .setProperty('project', 'Project-B'); } function getScriptProperties( propertiesService, key) { return propertiesService.getScriptProperties() .getProperty(key); }

স্বতন্ত্র স্ক্রিপ্টগুলিতে অ্যাক্সেস আপডেট করুন

V8 রানটাইমে চলমান স্বতন্ত্র স্ক্রিপ্টগুলির জন্য, স্ক্রিপ্টের ট্রিগারগুলি সঠিকভাবে কাজ করার জন্য আপনাকে ব্যবহারকারীদের অন্তত স্ক্রিপ্টে দেখার অ্যাক্সেস প্রদান করতে হবে।