জাভাস্ক্রিপ্টে একটি অবজেক্ট বাড়ানো হচ্ছে


164

আমি বর্তমানে জাভা থেকে জাভাস্ক্রিপ্টে রূপান্তর করছি এবং কীভাবে বস্তুগুলি এটি করতে চাই সেভাবে কীভাবে প্রসারিত করা যায় তা নির্ধারণ করা আমার পক্ষে কিছুটা কঠিন।

আমি ইন্টারনেটে বেশিরভাগ লোককে একটি পদ্ধতিতে এক্সটেন্ড অব অবজেক্ট নামে একটি পদ্ধতি ব্যবহার করতে দেখেছি। কোডটি এর মতো দেখাবে:

var Person = {
   name : 'Blank',
   age  : 22
}

var Robot = Person.extend({
   name : 'Robo',
   age  : 4
)}

var robot = new Robot();
alert(robot.name); //Should return 'Robo'

এই কাজটি কীভাবে করা যায় কেউ জানেন? শুনেছি আপনার লেখার দরকার আছে

Object.prototype.extend = function(...);

তবে আমি জানি না কীভাবে এই সিস্টেমটি কাজ করতে হয়। যদি এটি সম্ভব না হয় তবে দয়া করে আমাকে অন্য বিকল্পটি দেখান যা কোনও অবজেক্টকে প্রসারিত করে।


সত্য প্রত্যাবর্তন; তবে সে কারণেই আমি জিজ্ঞাসা করছি :)
উইটুজ

2
আমি MDN- র এই সুন্দর টিউটোরিয়ালটি দিয়ে যাওয়ার পরামর্শ দেব: - developer.mozilla.org/en/…
প্রণব

যদি সেই চমৎকার ডকগুলি পড়ার পরেও আপনি কোনও extendক্রিয়াকলাপ সম্পর্কে আগ্রহী হন তবে আমি এখানে একটি উদাহরণ স্থাপন করেছি: jsfiddle.net/k9LRd
ইউজিনিউ

2
'জাভা থেকে জাভাস্ক্রিপ্টে রূপান্তর করা' এবং আরও 'জাভা স্ক্রিপ্টের মতো একটি নতুন ভাষা শেখার, যা জাভার সাথে একই ধরনের বাক্য গঠন রয়েছে'
টনি লেইগ

উত্তর:


195

আপনি ব্যক্তির প্রোটোটাইপ অবজেক্ট থেকে 'উত্তরাধিকারী' করতে চান:

var Person = function (name) {
    this.name = name;
    this.type = 'human';
};

Person.prototype.info = function () {
    console.log("Name:", this.name, "Type:", this.type);
};

var Robot = function (name) {
    Person.apply(this, arguments);
    this.type = 'robot';
};

Robot.prototype = Person.prototype;  // Set prototype to Person's
Robot.prototype.constructor = Robot; // Set constructor back to Robot

person = new Person("Bob");
robot = new Robot("Boutros");

person.info();
// Name: Bob Type: human

robot.info();
// Name: Boutros Type: robot

4
আমার একটি প্রশ্ন আছে: Person()আপনি যখন করবেন তখন কনস্ট্রাক্টরকে কীভাবে ডাকা হচ্ছে new Robot()? এটা আমার মনে হচ্ছে যে আপনি যদি এর পরিবর্তে করছেন যে বেস বর্গ কন্সট্রাকটর কল করা উচিত this.name = name;মধ্যে Robot()কন্সট্রাকটর ...
অ্যালেক্সিস Wilke

21
@ অ্যালেক্সিসওয়িল্ক: হ্যাঁ, আপনাকে ফোন করা উচিত Person.apply(this, arguments);। এটি Robot.prototype = Object.create(Person.prototype);পরিবর্তে ব্যবহার না করাই ভাল new Person();
ফেলিক্স ক্লিং

18
যেমন ফেলিক্স বলেছেন, 'রোবট.প্রোটোটাইপ = পার্সন.প্রোটোটাইপ;' যদি কেউ 'রোবট' টাইপটির নিজস্ব প্রোটোটাইপ উদাহরণ থাকতে চায় তবে এটি একটি খারাপ ধারণা। নতুন রোবট নির্দিষ্ট ফাংশন যুক্ত করা এটিকে ব্যক্তিতে যুক্ত করবে।
জেমস উইলকিন্স

20
এই উদাহরণ সম্পূর্ণ ভুল। এটি করে আপনি ব্যক্তির প্রোটোটাইপটি পরিবর্তন করেন। এটি উত্তরাধিকার নয় এবং আপনি ব্যক্তি শ্রেণিতে একটি বিশাল গণ্ডগোলের ঝুঁকি ফেলছেন। উত্তরটি দেখুন যা Object.create () ব্যবহার করার পরামর্শ দেয়। এটি জিনিস করার সঠিক উপায়।
নিকোলাস-ভ্যান

6
@osahyoun এই উত্তরটির গুগলের অনুসন্ধানে উচ্চতর স্থান রয়েছে। আমি আপনাকে সত্যিই কোডটি ঠিক করার পরামর্শ দিচ্ছি এবং এখানে অন্যান্য মন্তব্যগুলির পরামর্শ অনুসারে প্রোটোটাইপ চেইনটি সংশোধন করব।
রাফা

101

"নতুন" কীওয়ার্ড ছাড়াই বিশ্ব।

এবং 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.
})

7
কনস্ট্রাক্টর ফাংশনটি ব্যবহার না করার জন্য একটি উত্সাহ রয়েছে।
nsmark

1
"শাস্ত্রীয় প্রশিক্ষিত" প্রোগ্রামারগণ, এর অর্থ কী?
পেট্রা

1
আমি একটি ধ্রুপদী ওওপি মানসিকতা থেকে এসেছি এবং এই উত্তরটি আমাকে অনেক সহায়তা করেছে। কোডে দুটি প্রশ্ন: 1) আজকের ES2015 Object.assign(Robot, {a:1}আপনার extend()পদ্ধতির জন্য কি ভাল বিকল্প ? 2) কীভাবে greet()পদ্ধতিটি ওভাররাইড করবেন যাতে এটি একই পাঠ্যটি ফেরত দেয় তবে "অভিবাদন ওভাররাইড" যুক্ত করে?
ব্যারি স্টেস

2
1) #Object.assignএকটি ভাল বিকল্পের মতো দেখায়। তবে ব্রাউজার সমর্থনটি এটিএম কম। 2) আপনি __proto__বস্তুর সম্পত্তিটি এর প্রোটোটাইপের শুভেচ্ছা ফাংশন অ্যাক্সেস করতে ব্যবহার করবেন। তারপরে আপনি কলির স্কোপটি পাস করার সাথে প্রোটোটাইপ গ্রিটিভ ফাংশনটিকে কল করবেন this এক্ষেত্রে ফাংশনটি একটি কনসোল লগ ছিল, সুতরাং এটি "সংযোজন" সম্ভব নয়। তবে এই উদাহরণটি দিয়ে আমি মনে করি আপনি বামনটি পেয়েছেন। skywalker.greet = function() { this.__proto__.greet.call(this); console.log('a greet override'); }
Calvintwr

1
ওয়েল এটি ECMAScript ভাষা নির্দিষ্টকরণ রক্ষণাবেক্ষণকারীদের সাথে আলোচনা করা উচিত। আমি সাধারণত একমত, তবে আমার যা আছে তা নিয়ে কাজ করতে হবে।

51

আপনি যদি এখনও কোনও উপায় আবিষ্কার না করে থাকেন তবে Object.prototypeনীচে দেখানো হিসাবে একটি বর্ধিত ফাংশন যুক্ত করতে জাভাস্ক্রিপ্ট অবজেক্টগুলির সংযুক্ত সম্পত্তিটি ব্যবহার করুন ।

Object.prototype.extend = function(obj) {
   for (var i in obj) {
      if (obj.hasOwnProperty(i)) {
         this[i] = obj[i];
      }
   }
};

তারপরে আপনি নীচে প্রদর্শিত হিসাবে এই ফাংশনটি ব্যবহার করতে পারেন।

var o = { member: "some member" };
var x = { extension: "some extension" };

o.extend(x);

18
সাবধান থাকুন যে 'পিতামাতা' শ্রেণিতে অবজেক্ট / অ্যারে ব্যবহার করার সময় এটি 'শিশু' শ্রেণিতে মূল অবজেক্টটির জন্য পয়েন্টার তৈরি করবে। বিশদভাবে জানাতে: আপনার পিতামাতার ক্লাসে যদি কোনও বিষয় বা অ্যারে থাকে তবে সেই ভিত্তিতে প্রসারিত শিশু শ্রেণিতে এটি সংশোধন করা আসলে এটি একই বেস ক্লাসে প্রসারিত সমস্ত শিশু শ্রেণির জন্য এটি সংশোধন করবে।
হ্যারল্ড

হ্যারল্ড, এই সত্যটি তুলে ধরার জন্য ধন্যবাদ। যে ব্যক্তি এই ফাংশনটি ব্যবহার করে তার জন্য একটি শর্ত অন্তর্ভুক্ত করা গুরুত্বপূর্ণ যা বস্তু / অ্যারেগুলি পরীক্ষা করে এবং সেগুলির অনুলিপি তৈরি করে।
tomilay

30

বিভিন্ন পদ্ধতির: অবজেক্ট.ক্রিয়েট

প্রতি @osahyoun উত্তরে, আমি নিম্নলিখিত ব্যক্তির প্রোটোটাইপ অবজেক্ট থেকে 'উত্তরাধিকারী' করার একটি ভাল এবং কার্যকর উপায় হিসাবে খুঁজে পেয়েছি:

function Person(name){
    this.name = name;
    this.type = 'human';
}

Person.prototype.info = function(){
    console.log("Name:", this.name, "Type:", this.type);
}

function Robot(name){
    Person.call(this, name)
    this.type = 'robot';
}

// Set Robot's prototype to Person's prototype by
// creating a new object that inherits from Person.prototype,
// and assigning it to Robot.prototype
Robot.prototype = Object.create(Person.prototype);

// Set constructor back to Robot
Robot.prototype.constructor = Robot;

নতুন দৃষ্টান্ত তৈরি করুন:

var person = new Person("Bob");
var robot = new Robot("Boutros");

person.info(); // Name: Bob Type: human
robot.info();  // Name: Boutros Type: robot

এখন, অবজেক্ট.ক্রিয়েট ব্যবহার করে :

Person.prototype.constructor !== Robot

এমডিএন ডকুমেন্টেশনও পরীক্ষা করে দেখুন ।


2
কেবলমাত্র @ গ্রেটক্লাবন বলতে চাই যে এটি সঠিকভাবে কাজ করে তবে আপনি nameপ্যারামিটারটি প্যারেন্টার কনস্ট্রাক্টরের কাছে দিচ্ছেন না, যেমন: jsfiddle.net/3brm0a7a/3 (পার্থক্যটি # লাইনে রয়েছে)
xPheRe

1
@ xPheRe আহ আমি দেখছি, ধন্যবাদ। আমি সেই পরিবর্তনটি
প্রতিবিম্বিত

1
@ এক্সফেরি, আমার ধারণা আমি যখন এই সমাধানটি যুক্ত করলাম তখন আমি একটি বিষয় প্রমাণ করার দিকে বেশি মনোযোগী ছিলাম। ধন্যবাদ।
লাইয়ার এলরুম

1
সুন্দর উত্তর +1, আপনি ECMAScript to. একবারে কীওয়ার্ড ক্লাস এবং প্রসারিতগুলি দেখতে পাবেন: বিকাশকারী.মোজিলা.আর.ইন.ইউএস
ডকস / ওয়েব / জাভা স্ক্রিপ্ট /…

26

ES6 এ , আপনি স্প্রেড অপারেটরের মতো ব্যবহার করতে পারেন

var mergedObj = { ...Obj1, ...Obj2 };

লক্ষ্য করুন যে অবজেক্ট.সেসাইন () সেটারগুলিকে ট্রিগার করে যেখানে স্প্রেড সিনট্যাক্স হয় না।

আরও তথ্যের জন্য লিঙ্কটি দেখুন, MDN- স্প্রেড সিনট্যাক্স


পুরানো উত্তর:

ES6 এ , Object.assignসম্পত্তি মানগুলি অনুলিপি করার জন্য রয়েছে । {}আপনি যদি লক্ষ্য অবজেক্টটি পরিবর্তন করতে না চান তবে প্রথম প্যারাম হিসাবে ব্যবহার করুন (প্রথম প্যারাম পাস হয়েছে)।

var mergedObj = Object.assign({}, Obj1, Obj2);

আরও তথ্যের জন্য লিঙ্কটি দেখুন, MDN - অবজেক্ট.সেসাইন ()

যদি আপনার প্রয়োজন হয় ES5 এর জন্য একটি পলিফিল হয় তবে লিঙ্কটি এটি সরবরাহ করে। :)


18

এবং আরও এক বছর পরে, আমি আপনাকে বলতে পারি আরও একটি দুর্দান্ত উত্তর রয়েছে।

আপনি যদি বিষয়গুলি / শ্রেণিতে প্রসারিত করতে প্রোটোটাইপিংয়ের কাজটি পছন্দ করেন না তবে এটিকে লক্ষ্য করুন: https://github.com/haroldiedema/joii

সম্ভাবনার দ্রুত উদাহরণ কোড (এবং আরও অনেক):

var Person = Class({

    username: 'John',
    role: 'Employee',

    __construct: function(name, role) {
        this.username = name;
        this.role = role;
    },

    getNameAndRole: function() {
        return this.username + ' - ' + this.role;
    }

});

var Manager = Class({ extends: Person }, {

  __construct: function(name)
  {
      this.super('__construct', name, 'Manager');
  }

});

var m = new Manager('John');
console.log(m.getNameAndRole()); // Prints: "John - Manager"

ঠিক আছে, 2 বছর শেষ না হওয়া পর্যন্ত আমার এখনও 2 মাস রয়েছে: পি যেভাবেই হোক, JOII 3.0 প্রকাশ হতে চলেছে :)
হ্যারল্ড

1
এটি 3 বছর পরে তৈরি করুন।

আকর্ষণীয় ধারণা, তবে সিনট্যাক্সটি দেখতে দেখতে কুরুচিপূর্ণ। আপনি ES6 ক্লাস স্থিতিশীল হওয়ার অপেক্ষা অপেক্ষা করা ভাল
স্লিপকালাল

আমি সম্পূর্ণরূপে @ স্লিপাইকেলের সাথে সম্মত। তবে দুর্ভাগ্যক্রমে, সমস্ত বড় / সাধারণ ব্রাউজারগুলি এটি প্রয়োগ করার আগে কমপক্ষে আরও 5 বছর হবে। সেই সময়ের অবধি, এইটি করতে হবে ...
হ্যারল্ড

12

যে লোকেরা এখনও সহজ এবং সর্বোত্তম পদ্ধতির জন্য লড়াই করছে, আপনি Spread Syntaxঅবজেক্ট অবজেক্টের জন্য ব্যবহার করতে পারেন ।

var person1 = {
      name: "Blank",
      age: 22
    };

var person2 = {
      name: "Robo",
      age: 4,
      height: '6 feet'
    };
// spread syntax
let newObj = { ...person1, ...person2 };
console.log(newObj.height);

দ্রষ্টব্য: মনে রাখবেন যে সম্পত্তিটির ডানদিকের সবচেয়ে বেশি অগ্রাধিকার থাকবে। এই উদাহরণে, person2ডানদিকে রয়েছে, সুতরাং এতে রোবোরnewObj নাম থাকবে ।


8

আপনি আন্ডারস্কোর.জেএস এর মতো সহায়ক লাইব্রেরি ব্যবহার করার বিষয়ে বিবেচনা করতে চাইতে পারেন , যার নিজস্ব প্রয়োগ রয়েছেextend()

এবং এটির উত্স কোডটি দেখে শেখারও একটি ভাল উপায়। সটীক সোর্স কোড পৃষ্ঠা বেশ দরকারী।


1
কিভাবে underscore.js এর একটি উদাহরণ _.extend(): কাজ তার কার্যকারিতা বেশ স্পষ্ট করে তোলে lostechies.com/chrismissal/2012/10/05/...
Lemmings19

6

মজিলা ECMAScript .0.০ থেকে অবধি অবধি প্রকাশ করার ঘোষণা করেছে:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/extends

দ্রষ্টব্য: এটি একটি পরীক্ষামূলক প্রযুক্তি, ECMAScript 6 (সম্প্রীতি) প্রস্তাবনার অংশ।

class Square extends Polygon {
  constructor(length) {
    // Here, it calls the parent class' constructor with lengths
    // provided for the Polygon's width and height
    super(length, length);
    // Note: In derived classes, super() must be called before you
    // can use 'this'. Leaving this out will cause a reference error.
    this.name = 'Square';
  }

  get area() {
    return this.height * this.width;
  }

  set area(value) {
    this.area = value;     } 
}

এই প্রযুক্তিটি গেকোতে উপলব্ধ (গুগল ক্রোম / ফায়ারফক্স) - 03/2015 রাত্রে বিল্ড।


4

বেশিরভাগ প্রকল্পে অবজেক্ট এক্সটেন্ডিংয়ের কিছু বাস্তবায়ন রয়েছে: আন্ডারস্কোর, জকিউরি, লোডাশ: প্রসারিত

খাঁটি জাভাস্ক্রিপ্ট প্রয়োগও রয়েছে, এটি ইসমাস্ক্রিপ্ট of এর একটি অংশ: অবজেক্ট.সাসাইন : https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / অবজেক্ট / পাসওয়ার্ড


"খাঁটি জাভাস্ক্রিপ্ট বাস্তবায়ন" এমন কোনও কিছুকে বোঝায় না যা কেবল জাভাস্ক্রিপ্ট দ্বারা প্রয়োগ করা হয়েছে, পরিবেশ-সরবরাহিত কোনও ফাংশনকে নয় যা স্থানীয়ভাবে প্রয়োগ করা যেতে পারে?
বিনকি

1
@ বিঙ্কি, আমি নেটিভ জাভাস্ক্রিপ্ট বাস্তবায়ন বলতে চাইছিলাম - ইসমাস্ক্রিপ্ট ২০১৫ (ইএস)) স্ট্যান্ডার্ডের অংশ
সেজারি ড্যানিয়েল নওক

2
Function.prototype.extends=function(ParentClass) {
    this.prototype = new ParentClass();
    this.prototype.constructor = this;
}

তারপর:

function Person() {
    this.name = "anonym"
    this.skills = ["abc"];
}
Person.prototype.profile = function() {
    return this.skills.length // 1
};

function Student() {} //well extends fom Person Class
Student.extends(Person)

var s1 = new Student();
s1.skills.push("")
s1.profile() // 2

আপডেট 01/2017:

দয়া করে, 2015 এর আমার উত্তর উপেক্ষা করুন যেহেতু জাভাস্ক্রিপ্ট এখন extendsES6 (একমাস্তিপটি 6) থেকে কীওয়ার্ড সমর্থন করে

- ইএস 6:

class Person {
   constructor() {
     this.name = "anonym"
     this.skills = ["abc"];
   }

   profile() {
    return this.skills.length // 1
   }

}

Person.MAX_SKILLS = 10;
class Student extends Person {


} //well extends from Person Class

//-----------------
var s1 = new Student();
s1.skills.push("")
s1.profile() // 2

- ইএস 7:

class Person {
    static MAX_SKILLS = 10;
    name = "anonym"
    skills = ["abc"];

    profile() {
      return this.skills.length // 1
    }

}
class Student extends Person {


} //well extends from Person Class

//-----------------
var s1 = new Student();
s1.skills.push("")
s1.profile() // 2

1
new ParentClass()কনস্ট্রাক্টর ওভাররাইট করার আগে ফোন করে আপনি ইতিমধ্যে প্যারেন্ট কনস্ট্রাক্টরকে কার্যকর করেছেন। আপনি যদি আমাকে জিজ্ঞাসা করেন তবে আমি সঠিক আচরণটি সঠিক মনে করি না ...
হ্যারল্ড

1

সারসংক্ষেপ:

জাভাস্ক্রিপ্ট একটি প্রক্রিয়া ব্যবহার করে যা প্রোটোটাইপাল উত্তরাধিকার বলে । প্রোটোটাইপাল উত্তরাধিকার কোনও বস্তুর কোনও সম্পত্তি অনুসন্ধান করার সময় ব্যবহৃত হয়। যখন আমরা জাভাস্ক্রিপ্টে বৈশিষ্ট্যগুলি প্রসারিত করছি আমরা একটি প্রকৃত অবজেক্ট থেকে এই বৈশিষ্ট্যগুলি উত্তরাধিকার সূত্রে পাই। এটি নিম্নলিখিত পদ্ধতিতে কাজ করে:

  1. যখন কোনও সামগ্রীর সম্পত্তি অনুরোধ করা হয়, (যেমন myObj.fooবা myObj['foo']) জেএস ইঞ্জিন প্রথমে সেই বস্তুর নিজেরাই সেই সম্পত্তিটির সন্ধান করবে
  2. যখন এই সম্পত্তিটি বস্তুটিতে পাওয়া যায় না তখন এটি প্রোটোটাইপ অবজেক্টের প্রোটোটাইপ চেইন বর্ণনটি আরোহণ করবে । যদি এই সম্পত্তিটি এখানেও না পাওয়া যায় তবে সম্পত্তিটি না পাওয়া পর্যন্ত এটি প্রোটোটাইপ চেইনে আরোহণ করতে থাকবে। সম্পত্তি না পাওয়া গেলে এটি একটি রেফারেন্স ত্রুটি নিক্ষেপ করবে।

যখন আমরা জাভাস্ক্রিপ্টের কোনও অবজেক্ট থেকে প্রসারিত করতে চাই আমরা কেবল প্রজোটাইপ চেইনে এই অবজেক্টটি লিঙ্ক করতে পারি। এটি অর্জনের অসংখ্য উপায় রয়েছে, আমি 2 টি সাধারণত ব্যবহৃত পদ্ধতি বর্ণনা করব।

উদাহরণ:

1। Object.create()

Object.create()একটি ফাংশন যা কোনও বস্তুকে আর্গুমেন্ট হিসাবে গ্রহণ করে এবং একটি নতুন অবজেক্ট তৈরি করে। আর্গুমেন্ট হিসাবে যে বস্তুটি পাস করা হয়েছিল তা হ'ল নতুন তৈরি হওয়া অবজেক্টের প্রোটোটাইপ। উদাহরণ স্বরূপ:

// prototype of the dog
const dogPrototype = {
  woof: function () { console.log('woof'); }
}

// create 2 dog objects, pass prototype as an argument
const fluffy = Object.create(dogPrototype);
const notFluffy = Object.create(dogPrototype);

// both newly created object inherit the woof 
// function from the dogPrototype
fluffy.woof();
notFluffy.woof();

2. স্পষ্টভাবে প্রোটোটাইপ সম্পত্তি সেট

কনস্ট্রাক্টর ফাংশন ব্যবহার করে অবজেক্ট তৈরি করার সময়, আমরা এর প্রোটোটাইপ অবজেক্ট প্রোপার্টিতে অ্যাড প্রোপার্টি সেট করতে পারি। যে শব্দগুলি তৈরি করা হয় তারা newকীওয়ার্ডটি ব্যবহার করার সময় কনস্ট্রাক্টর ফাংশন গঠন করে , তাদের প্রোটোটাইপটি কনস্ট্রাক্টর ফাংশনের প্রোটোটাইপে সেট করে। উদাহরণ স্বরূপ:

// Constructor function object
function Dog (name) {
   name = this.name;
}

// Functions are just objects
// All functions have a prototype property
// When a function is used as a constructor (with the new keyword)
// The newly created object will have the consturctor function's
// prototype as its prototype property
Dog.prototype.woof = function () {
  console.log('woof');
}

// create a new dog instance
const fluffy = new Dog('fluffyGoodBoyyyyy');
// fluffy inherits the woof method
fluffy.woof();

// can check the prototype in the following manner
console.log(Object.getPrototypeOf(fluffy));


0

আপনি কেবল এটি ব্যবহার করে করতে পারেন:

Object.prototype.extend = function(object) {
  // loop through object 
  for (var i in object) {
    // check if the extended object has that property
    if (object.hasOwnProperty(i)) {
      // mow check if the child is also and object so we go through it recursively
      if (typeof this[i] == "object" && this.hasOwnProperty(i) && this[i] != null) {
        this[i].extend(object[i]);
      } else {
        this[i] = object[i];
      }
    }
  }
  return this;
};

আপডেট: আমি this[i] != nullযেহেতু nullএকটি বস্তু হিসাবে পরীক্ষা করেছি

তারপরে এটি ব্যবহার করুন:

var options = {
      foo: 'bar',
      baz: 'dar'
    }

    var defaults = {
      foo: false,
      baz: 'car',
      nat: 0
    }

defaults.extend(options);

এটি ভাল ফলাফল:

// defaults will now be
{
  foo: 'bar',
  baz: 'dar',
  nat: 0
}

0

ডাউনলোডের জন্য যুক্ত করুন কারণ দয়া করে

  • প্রসারিত করার জন্য কোনও বাহ্যিক গ্রন্থাগার ব্যবহার করার দরকার নেই

  • জাভাস্ক্রিপ্টে, সমস্ত কিছুই একটি অবজেক্ট (তিনটি আদিম ডেটাটাইপগুলি বাদে এবং এমনকি প্রয়োজনের সময় সেগুলি স্বয়ংক্রিয়ভাবে বস্তুতে আবৃত থাকে)। তদুপরি, সমস্ত বস্তু পরিবর্তনযোগ্য।

জাভাস্ক্রিপ্টে ক্লাস পার্সন

function Person(name, age) {
    this.name = name;
    this.age = age;
}
Person.prototype = {
    getName: function() {
        return this.name;
    },
    getAge: function() {
        return this.age;
    }
}

/* Instantiate the class. */
var alice = new Person('Alice', 93);
var bill = new Person('Bill', 30);

একটি নির্দিষ্ট উদাহরণ / অবজেক্টটি সংশোধন করুন

alice.displayGreeting = function() 
{
    alert(this.getGreeting());
}

ক্লাসটি সংশোধন করুন

Person.prototype.getGreeting = function() 
{
    return 'Hi ' + this.getName() + '!';
};

বা সহজভাবে বলুন: প্রসারিত জেএসওএন এবং ওবিজেইসিটি উভয়ই একই

var k = {
    name : 'jack',
    age : 30
}

k.gender = 'male'; /*object or json k got extended with new property gender*/

রস হার্মসকে ধন্যবাদ, ডাস্টিন ডিয়াজ


-1

এটি আপনার বৈশিষ্ট্যগুলি প্রসারিত অবজেক্টটি পরিবর্তন না করে অবজেক্ট প্যারামিটার প্রোটোটাইপগুলির সাথে একটি নতুন অবজেক্ট তৈরি করতে প্রসারিত করবে।

function extend(object) {
    if (object === null)
        throw TypeError;
    if (typeof object !== "object" && typeof object !== "function")
        throw TypeError;
    if (Object.create)
        return Object.create(object);
    function f() {}
    ;
    f.prototype = p;
    return new f();
}

তবে আপনি যদি নিজের অবজেক্টটিকে প্যারামিটারগুলি সংশোধন না করে প্রসারিত করতে চান তবে আপনি নিজের অবজেক্টে এক্সটেনডপ্রোপার্টি যুক্ত করতে পারেন।

var Person{
//some code
extend: extendProperty
}

//Enforce type checking an Error report as you wish
    function extendProperty(object) {
        if ((object !== null && (typeof object === "object" || typeof object === "function"))){
            for (var prop in object) {
                if (object.hasOwnProperty(prop))
                    this[prop] = object[prop];
            }
        }else{
            throw TypeError; //Not an object
        }
    }

-2

প্রোটোটাইপিং একটি দুর্দান্ত উপায়, তবে প্রোটোটাইপটি কখনও কখনও বেশ বিপজ্জনক এবং ত্রুটিগুলি হতে পারে। আমি এটিকে বেস অবজেক্টে এনপ্যাপুলেট করতে পছন্দ করি, যেমন এমবার.জেএস এটি এর এমবার.ওজেক্ট.একসেট এবং এমবার.ওজেক্ট.রেপেনকে করে। এটি ব্যবহারে অনেক বেশি সুরক্ষিত।

আমি আপনাকে একটি সেট তৈরি করেছি যাতে আপনি কীভাবে এম্বার.অবজেক্ট ব্যবহার করে তার অনুরূপ কিছু সেটআপ করবেন ।

লিঙ্কটি এখানে: https://gist.github.com/WebCloud/cbfe2d848c80d4b9e9bd


9
Prototyping is a nice way, but prototype is quite dangerous sometimes and can lead to bugs.এর মানে কি বোঝাতে চাচ্ছো? জাভাস্ক্রিপ্টে প্রোটোটাইপ চেইন ব্যবহার করার ফলে বাগগুলি হতে পারে? এটি জাভাতে ক্লাস ব্যবহার করা বাগের দিকে নিয়ে যেতে পারে এবং একেবারেই কোনও অর্থহীন তা বলার মতো।
এইচএমআর

@ এইচএমআর তিনি বলছেন যে পরিবেশ-সরবরাহিত অবজেক্ট প্রোটোটাইপগুলি প্রসারিত করার ফলে ভঙ্গুর কোডের ফলাফল হয় যা ভবিষ্যতের মূল জাভাস্ক্রিপ্ট ভাষা বৈশিষ্ট্যের সাথে দ্বন্দ্ব হতে পারে। যদি আপনি Objectপ্রোটোটাইপ প্রসারিত করে সমস্ত কিছুতে একটি দরকারী ইউটিলিটি ফাংশন যুক্ত করেন তবে আপনার ফাংশনটির ভবিষ্যতের জাভাস্ক্রিপ্ট ফাংশন হিসাবে একই নাম থাকতে পারে এবং ভবিষ্যতে চলাকালীন আপনার কোডটি বিস্ফোরণ ঘটায়। উদাহরণস্বরূপ, বলুন যে আপনি কোনও repeat()ফাংশন যুক্ত করেছেন Objectএবং এটি Stringউদাহরণ হিসাবে কল করেছেন এবং তারপরে আপনার জাভাস্ক্রিপ্ট রানটাইমটি ইএস 6 এ আপডেট হয়েছে?
বিনকি

@ বিঙ্কি আপনার ইনপুট দেওয়ার জন্য আপনাকে ধন্যবাদ। আপনি নিজের মালিকানাধীন নয় এমন ক্লাসগুলির প্রোটোটাইপ পরিবর্তন করার বিষয়ে কথা বলছেন এবং এরপরে ইনক্যাপসুলেশন রেফারেন্সটি ভাঙবেন: developer.mozilla.org/en/docs/Web/JavaScript/… জেএসের ব্যক্তিগত ভেরিয়েবল নেই তাই আপনার এপিআই বাস্তবায়নকারী সদস্যদের এক্সপোজ করে দেয় , এটি সাধারণত কনভেনশন দ্বারা সমাধান করা হয় (আন্ডারস্কোর দিয়ে সদস্যের নাম শুরু করুন)। নিশ্চিত না যে অপ্টটি মূলত সমস্যাটি কিনা বা সিনট্যাক্সটি বিভ্রান্তিকর এবং অনেক লোক এটি বুঝতে পারে না।
এইচএমআর

@ এইচএমআর, আমি ভুল হতে পারি তবে আমার মনে হয় "তবে প্রোটোটাইপটি বেশ বিপজ্জনক" কুখ্যাত প্রোটোটাইপ কাঠামোকে বোঝায় যা ভাষার বৈশিষ্ট্যটির অপব্যবহার করতে পারেprototype
বিনকি

প্রোটোটাইপিং বিপজ্জনক কারণ আপনি যদি তৈরি করেন নি এমন বস্তুগুলি ব্যবহার করেন তবে আপনি সর্বদা জানেন না যে প্রোটোটাইপগুলি হিসাবে এগুলি ব্যবহার করার ফলে কী হবে। উদাহরণস্বরূপ এই ঝাঁকুনিটি দেখুন
আরকাইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.