"নতুন" কীওয়ার্ড ছাড়াই বিশ্ব।
এবং Object.create () এর সাথে সরল "গদ্যের মতো" বাক্য গঠন ax
* এই উদাহরণটি ES6 শ্রেণীর জন্য আপডেট করা হয়েছে।
প্রথমে মনে রাখবেন যে জাভাস্ক্রিপ্ট একটি প্রোটোটাইপাল ভাষা । এটি শ্রেণিবদ্ধ নয়। তাই, প্রোটোটাইপিয়াল আকারে লেখার প্রকৃত প্রকৃতিটি প্রকাশিত হয় এবং এটি খুব সাধারণ, গদ্যের মতো এবং শক্তিশালী হতে পারে।
TLDR;
const Person = { name: 'Anonymous' } // person has a name
const jack = Object.create(Person) // jack is a person
jack.name = 'Jack' // and has a name 'Jack'
না, আপনার কোনও নির্মাণকারীর প্রয়োজন নেই, কোনও new
তাত্পর্য নেই ( কেন ব্যবহারnew
করবেন না তা পড়ুন ), না super
, কোনও মজার মজার নয় __construct
। আপনি কেবল অবজেক্ট তৈরি করুন এবং তারপরে এগুলি প্রসারিত বা মোড়ক করুন।
( আপনি getters এবং setters সম্পর্কে জানতে তাহলে "আরও পড়ুন" বিভাগে কিভাবে এই প্যাটার্ন একটি উপায় জাভাস্ক্রিপ্ট করেছে আপনি বিনামূল্যে getters এবং setters দেয় দেখতে দেখতে মূলত জন্য দেয়ার উদ্দেশ্যে করা, এবং কিভাবে শক্তিশালী তারা ।)
গদ্যের মতো সিনট্যাক্স: বেস প্রোটাইপ
const Person = {
//attributes
firstName : 'Anonymous',
lastName: 'Anonymous',
birthYear : 0,
type : 'human',
//methods
name() { return this.firstName + ' ' + this.lastName },
greet() {
console.log('Hi, my name is ' + this.name() + ' and I am a ' + this.type + '.' )
},
age() {
// age is a function of birth time.
}
}
const person = Object.create(Person). // that's it!
এক নজরে, দেখতে খুব পঠনযোগ্য।
সম্প্রসারণ, এর বংশধর তৈরি করা Person
* সঠিক পদগুলি prototypes
এবং তাদের descendants
। নেই classes
, এবং কোন প্রয়োজন নেই instances
।
const Skywalker = Object.create(Person)
Skywalker.lastName = 'Skywalker'
const anakin = Object.create(Skywalker)
anakin.firstName = 'Anakin'
anakin.birthYear = '442 BBY'
anakin.gender = 'male' // you can attach new properties.
anakin.greet() // 'Hi, my name is Anakin Skywalker and I am a human.'
Person.isPrototypeOf(Skywalker) // outputs true
Person.isPrototypeOf(anakin) // outputs true
Skywalker.isPrototypeOf(anakin) // outputs true
একটি তৈরি করার "ডিফল্ট" উপায় সরবরাহ করার একটি উপায়, descendant
কোনও #create
পদ্ধতি সংযুক্তি দ্বারা :
Skywalker.create = function(firstName, gender, birthYear) {
let skywalker = Object.create(Skywalker)
Object.assign(skywalker, {
firstName,
birthYear,
gender,
lastName: 'Skywalker',
type: 'human'
})
return skywalker
}
const anakin = Skywalker.create('Anakin', 'male', '442 BBY')
নীচের উপায়গুলিতে পাঠযোগ্যতা কম:
"শাস্ত্রীয়" সমতুল্যের সাথে তুলনা করুন:
function Person (firstName, lastName, birthYear, type) {
this.firstName = firstName
this.lastName = lastName
this.birthYear = birthYear
this.type = type
}
// attaching methods
Person.prototype.name = function() { return firstName + ' ' + lastName }
Person.prototype.greet = function() { ... }
Person.prototype.age = function() { ... }
function Skywalker(firstName, birthYear) {
Person.apply(this, [firstName, 'Skywalker', birthYear, 'human'])
}
// confusing re-pointing...
Skywalker.prototype = Person.prototype
Skywalker.prototype.constructor = Skywalker
const anakin = new Skywalker('Anakin', '442 BBY')
Person.isPrototypeOf(anakin) // returns false!
Skywalker.isPrototypeOf(anakin) // returns false!
"শাস্ত্রীয়" স্টাইল ব্যবহার করে কোড পঠনযোগ্যতা এতটা ভাল নয়।
ES6 ক্লাস
স্বীকার করা, এই সমস্যাগুলির কিছু ES6 ক্লাস দ্বারা নির্মূল করা হয়েছে, তবে এখনও:
class Person {
constructor(firstName, lastName, birthYear, type) {
this.firstName = firstName
this.lastName = lastName
this.birthYear = birthYear
this.type = type
}
name() { return this.firstName + ' ' + this.lastName }
greet() { console.log('Hi, my name is ' + this.name() + ' and I am a ' + this.type + '.' ) }
}
class Skywalker extends Person {
constructor(firstName, birthYear) {
super(firstName, 'Skywalker', birthYear, 'human')
}
}
const anakin = new Skywalker('Anakin', '442 BBY')
// prototype chain inheritance checking is partially fixed.
Person.isPrototypeOf(anakin) // returns false!
Skywalker.isPrototypeOf(anakin) // returns true
বেস প্রোটোটাইপ শাখা
// create a `Robot` prototype by extending the `Person` prototype:
const Robot = Object.create(Person)
Robot.type = 'robot'
Robot.variant = '' // add properties for Robot prototype
এর সাথে অনন্য পদ্ধতি যুক্ত করুন Robot
// Robots speak in binaries, so we need a different greet function:
Robot.machineGreet = function() { /*some function to convert strings to binary */ }
// morphing the `Robot` object doesn't affect `Person` prototypes
anakin.greet() // 'Hi, my name is Anakin Skywalker and I am a human.'
anakin.machineGreet() // error
উত্তরাধিকার পরীক্ষা করা হচ্ছে
Person.isPrototypeOf(Robot) // outputs true
Robot.isPrototypeOf(Skywalker) // outputs false
আপনার প্রয়োজনীয় সমস্ত কিছু আপনি ইতিমধ্যে পেয়েছেন! কোন কনস্ট্রাক্টর নেই, ইনস্ট্যান্টেশন নেই। পরিষ্কার, পরিষ্কার গদ্য।
আরও পড়া
লেখার যোগ্যতা, কনফিগারেশন এবং ফ্রি গেটারস এবং সেটারগুলি!
বিনামূল্যে গিটার এবং সেটটার বা অতিরিক্ত কনফিগারেশনের জন্য আপনি অবজেক্ট.ক্রিয়েট () এর দ্বিতীয় যুক্তি ওরফে বৈশিষ্ট্যগুলি অবজেক্ট ব্যবহার করতে পারেন। এটি # Object.defineProperty এবং # Object.defineProperties এও উপলব্ধ ।
এটি কতটা শক্তিশালী তা উদাহরণস্বরূপ, ধরুন আমরা চাই সমস্তগুলি Robot
কঠোরভাবে ধাতব (মাধ্যমে writable: false
) তৈরি করা উচিত এবং powerConsumption
মানগুলি (গেটার্স এবং সেটারগুলির মাধ্যমে ) মানক করে দেওয়া হোক ।
const Robot = Object.create(Person, {
// define your property attributes
madeOf: {
value: "metal",
writable: false,
configurable: false,
enumerable: true
},
// getters and setters, how javascript had (naturally) intended.
powerConsumption: {
get() { return this._powerConsumption },
set(value) {
if (value.indexOf('MWh')) return this._powerConsumption = value.replace('M', ',000k')
this._powerConsumption = value
throw new Error('Power consumption format not recognised.')
}
}
})
const newRobot = Object.create(Robot)
newRobot.powerConsumption = '5MWh'
console.log(newRobot.powerConsumption) // outputs 5,000kWh
এবং সমস্ত প্রোটোটাইপ কারণ অন্য কিছু Robot
হতে madeOf
পারে না writable: false
।
const polymerRobot = Object.create(Robot)
polymerRobot.madeOf = 'polymer'
console.log(polymerRobot.madeOf) // outputs 'metal'
মিক্সিনস (# অবজেক্ট.স্যাসাইন ব্যবহার করে) - আনাকিন স্কাইওয়াকার
বুঝতে পারছো কোথায় যাচ্ছে ...?
const darthVader = Object.create(anakin)
// for brevity, property assignments are skipped because you get the point by now.
Object.assign(darthVader, Robot)
দারথ ভাদার এর পদ্ধতিগুলি পান Robot
:
darthVader.greet() // inherited from `Person`, outputs "Hi, my name is Darth Vader..."
darthVader.machineGreet() // inherited from `Robot`, outputs 001010011010...
অন্যান্য বিজোড় বিষয়গুলির সাথে:
console.log(darthVader.type) // outputs robot.
Robot.isPrototypeOf(darthVader) // returns false.
Person.isPrototypeOf(darthVader) // returns true.
ঠিক আছে, দার্ট ভাদার মানুষ বা যন্ত্র প্রকৃতপক্ষে বিষয়বস্তুযুক্ত:
"সে এখন মানুষের চেয়ে বেশি যন্ত্র, বাঁকানো ও দুষ্টু।" - ওবি-ওয়ান কেনোবি
"আমি জানি আপনার মধ্যে ভাল কিছু আছে।" - Luke Skywalker
অতিরিক্ত - # অবজেক্ট.সেসাইন সহ সামান্য সংক্ষিপ্ত বাক্য গঠন
সমস্ত সম্ভাবনায়, এই প্যাটার্নটি আপনার সিনট্যাক্সকে ছোট করে। তবে ES6 # অবজেক্ট.সেসাইন আরও কিছুটা ছোট করতে পারে (পুরানো ব্রাউজারগুলিতে পলিফিল ব্যবহারের জন্য, ES6 তে MDN দেখুন )।
//instead of this
const Robot = Object.create(Person)
Robot.name = "Robot"
Robot.madeOf = "metal"
//you can do this
const Robot = Object.create(Person)
Object.assign(Robot, {
name: "Robot",
madeOf: "metal"
// for brevity, you can imagine a long list will save more code.
})