নতুন class
সিনট্যাক্স আপাতত বেশিরভাগ সিনট্যাকটিক চিনি। (তবে, আপনি জানেন, ভাল ধরণের চিনি) ES2015-ES2020 তে এমন কিছুই নেই class
যা আপনি কনস্ট্রাক্টর ফাংশন এবং Reflect.construct
(সাবক্লাসিং Error
এবং including সহ Array
) করতে পারবেন না এমন করতে পারে । (এটা হল সম্ভবত সেখানে ES2021 মধ্যে কিছু বিষয় আছে যা আপনি করতে পারেন হতে হবে class
যে আপনি অন্যথায় ব্যবহার করতে পারবেন না: ব্যক্তিগত ক্ষেত্র , ব্যক্তিগত পদ্ধতি , এবং স্ট্যাটিক ক্ষেত্র / ব্যক্তিগত স্ট্যাটিক পদ্ধতি ।)
তদুপরি, class
অন্য ধরণের ওওপি বা এটি এখনও জাভাস্ক্রিপ্টের প্রোটোটাইপিকাল উত্তরাধিকার?
এটি যদি আমাদের নির্মাণকারী ফাংশন ( new Foo
ইত্যাদি) ব্যবহার করতে পছন্দ করে তবে ক্লিনার এবং আরও সুবিধাজনক সিনট্যাক্স সহ আমাদের সর্বদা একই প্রোটোটাইপিকাল উত্তরাধিকার ছিল । (বিশেষতঃ ES5 এবং এর আগে আপনি যেটা করতে পারেননি তা থেকে প্রাপ্ত হওয়ার ক্ষেত্রে Array
বা Error
আপনি এখন পুরানো ES5- শৈলীর সাথে নয় Reflect.construct
[ স্পট , MDN ] দিয়ে পারেন ))
আমি কি এটি ব্যবহার করে পরিবর্তন করতে পারি .prototype
?
হ্যাঁ, আপনি prototype
ক্লাসটি তৈরি করার পরেও ক্লাসের নির্মাণকারীর উপর অবজেক্টটি সংশোধন করতে পারেন । উদাহরণস্বরূপ, এটি পুরোপুরি আইনী:
class Foo {
constructor(name) {
this.name = name;
}
test1() {
console.log("test1: name = " + this.name);
}
}
Foo.prototype.test2 = function() {
console.log("test2: name = " + this.name);
};
গতির সুবিধা কি আছে?
এটির জন্য একটি নির্দিষ্ট আইডিয়ম সরবরাহ করে, আমি মনে করি এটি সম্ভবত সম্ভব যে ইঞ্জিনটি আরও ভাল কাজটি করতে পারে। তবে তারা ইতিমধ্যে অপ্টিমাইজ করাতে খুব ভাল, আমি উল্লেখযোগ্য পার্থক্য আশা করব না।
ES2015 (ES6) class
সিনট্যাক্স কী সুবিধা দেয় ?
সংক্ষেপে: আপনি যদি প্রথমে কনস্ট্রাক্টর ফাংশন ব্যবহার না করেন তবে পছন্দসই Object.create
বা অনুরূপ, আপনার class
পক্ষে কার্যকর নয়।
আপনি যদি কনস্ট্রাক্টর ফাংশন ব্যবহার করেন তবে এর কিছু সুবিধা রয়েছে class
:
সিনট্যাক্সটি সহজ এবং ত্রুটি-প্রবণ কম।
এটা অনেক সহজ হয় (এবং আবার, কম ত্রুটি-প্রবণ) পুরানোর সঙ্গে বেশি নতুন সিনট্যাক্স ব্যবহার উত্তরাধিকার শ্রেণীবিন্যাসের সেট আপ করার জন্য।
class
new
কনস্ট্রাক্টর ফাংশনটি ব্যবহার করতে ব্যর্থ হওয়ার সাধারণ ত্রুটি থেকে আপনাকে রক্ষা করে (কনস্ট্রাক্টরের this
পক্ষে বৈধ অবজেক্ট না হলে কনস্ট্রাক্টর একটি ব্যতিক্রম নিক্ষেপ করে )।
কোনও পদ্ধতির প্যারেন্ট প্রোটোটাইপের সংস্করণটি কল করা পুরানো ( বা super.method()
পরিবর্তে ) এর চেয়ে নতুন সিনট্যাক্সের সাথে অনেক সহজ ।ParentConstructor.prototype.method.call(this)
Object.getPrototypeOf(Object.getPrototypeOf(this)).method.call(this)
শ্রেণিবিন্যাসের জন্য এখানে একটি বাক্য গঠন তুলনা:
class Person {
constructor(first, last) {
this.first = first;
this.last = last;
}
personMethod() {
}
}
class Employee extends Person {
constructor(first, last, position) {
super(first, last);
this.position = position;
}
employeeMethod() {
}
}
class Manager extends Employee {
constructor(first, last, position, department) {
super(first, last, position);
this.department = department;
}
personMethod() {
const result = super.personMethod();
return result;
}
managerMethod() {
}
}
উদাহরণ:
class Person {
constructor(first, last) {
this.first = first;
this.last = last;
}
personMethod() {
return `Result from personMethod: this.first = ${this.first}, this.last = ${this.last}`;
}
}
class Employee extends Person {
constructor(first, last, position) {
super(first, last);
this.position = position;
}
personMethod() {
const result = super.personMethod();
return result + `, this.position = ${this.position}`;
}
employeeMethod() {
}
}
class Manager extends Employee {
constructor(first, last, position, department) {
super(first, last, position);
this.department = department;
}
personMethod() {
const result = super.personMethod();
return result + `, this.department = ${this.department}`;
}
managerMethod() {
}
}
const m = new Manager("Joe", "Bloggs", "Special Projects Manager", "Covert Ops");
console.log(m.personMethod());
বনাম
var Person = function(first, last) {
if (!(this instanceof Person)) {
throw new Error("Person is a constructor function, use new with it");
}
this.first = first;
this.last = last;
};
Person.prototype.personMethod = function() {
};
var Employee = function(first, last, position) {
if (!(this instanceof Employee)) {
throw new Error("Employee is a constructor function, use new with it");
}
Person.call(this, first, last);
this.position = position;
};
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;
Employee.prototype.employeeMethod = function() {
};
var Manager = function(first, last, position, department) {
if (!(this instanceof Manager)) {
throw new Error("Manager is a constructor function, use new with it");
}
Employee.call(this, first, last, position);
this.department = department;
};
Manager.prototype = Object.create(Employee.prototype);
Manager.prototype.constructor = Manager;
Manager.prototype.personMethod = function() {
var result = Employee.prototype.personMethod.call(this);
return result;
};
Manager.prototype.managerMethod = function() {
};
সরাসরি উদাহরণ:
var Person = function(first, last) {
if (!(this instanceof Person)) {
throw new Error("Person is a constructor function, use new with it");
}
this.first = first;
this.last = last;
};
Person.prototype.personMethod = function() {
return "Result from personMethod: this.first = " + this.first + ", this.last = " + this.last;
};
var Employee = function(first, last, position) {
if (!(this instanceof Employee)) {
throw new Error("Employee is a constructor function, use new with it");
}
Person.call(this, first, last);
this.position = position;
};
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;
Employee.prototype.personMethod = function() {
var result = Person.prototype.personMethod.call(this);
return result + ", this.position = " + this.position;
};
Employee.prototype.employeeMethod = function() {
};
var Manager = function(first, last, position, department) {
if (!(this instanceof Manager)) {
throw new Error("Manager is a constructor function, use new with it");
}
Employee.call(this, first, last, position);
this.department = department;
};
Manager.prototype = Object.create(Employee.prototype);
Manager.prototype.constructor = Manager;
Manager.prototype.personMethod = function() {
var result = Employee.prototype.personMethod.call(this);
return result + ", this.department = " + this.department;
};
Manager.prototype.managerMethod = function() {
};
var m = new Manager("Joe", "Bloggs", "Special Projects Manager", "Covert Ops");
console.log(m.personMethod());
আপনি দেখতে পাচ্ছেন, সেখানে প্রচুর পুনরাবৃত্তি এবং ভার্বোজের জিনিস যা ভুল পাওয়া সহজ এবং পুনরায় টাইপ করার জন্য বিরক্তিকর (যার জন্য আমি এটি করার জন্য একটি স্ক্রিপ্ট লিখেছিলাম , দিনের মধ্যেই)।
¹ "ES2015-ES2018 কিছুই যে নেই class
যে আপনার কন্সট্রাকটর ফাংশন সঙ্গে ব্যবহার করতে পারবেন না এবং করতে পারেন Reflect.construct
(তত্সহ subclassing Error
এবং Array
)"
উদাহরণ:
function MyError(...args) {
return Reflect.construct(Error, args, this.constructor);
}
MyError.prototype = Object.create(Error.prototype);
MyError.prototype.constructor = MyError;
MyError.prototype.myMethod = function() {
console.log(this.message);
};
function outer() {
function inner() {
const e = new MyError("foo");
console.log("Callng e.myMethod():");
e.myMethod();
console.log(`e instanceof MyError? ${e instanceof MyError}`);
console.log(`e instanceof Error? ${e instanceof Error}`);
throw e;
}
inner();
}
outer();
.as-console-wrapper {
max-height: 100% !important;
}