জাভাস্ক্রিপ্ট উত্তরাধিকার: অবজেক্ট.ক্রিয়েট বনাম নতুন


123

জাভাস্ক্রিপ্টে এই দুটি উদাহরণের মধ্যে পার্থক্য কী:

পূর্বশর্তঃ

function SomeBaseClass(){
}

SomeBaseClass.prototype = {
    doThis : function(){
    },

    doThat : function(){
    }
}

উত্তরাধিকার উদাহরণ

function MyClass(){
}

MyClass.prototype = Object.create(SomeBaseClass.prototype);

উত্তরাধিকার উদাহরণ বি নতুন কীওয়ার্ড ব্যবহার করে

function MyClass(){
}

MyClass.prototype = new SomeBaseClass();

উভয় উদাহরণ একই জিনিস করা বলে মনে হচ্ছে। আপনি কখন একজনকে বেছে নেবেন?

একটি অতিরিক্ত প্রশ্ন: নীচের লিঙ্কের কোডটি বিবেচনা করুন (লাইন 15), যেখানে ফাংশনটির নিজস্ব নির্মাতার একটি উল্লেখ প্রোটোটাইপে সংরক্ষণ করা হয়েছে। কেন এটি দরকারী?

https://github.com/mrdoob/three.js/blob/master/src/loaders/ImageLoader.js

অংশ (যদি আপনি লিঙ্কটি খুলতে না চান):

THREE.ImageLoader.prototype = {

    constructor: THREE.ImageLoader
}

23
কেন হেকটিকে এটি নকল হিসাবে চিহ্নিত করা হচ্ছে!?! অন্যান্য প্রশ্ন এবং উত্তরগুলিও উল্লেখ করবেন না Object.create। এটি একটি ভুল, এবং এটি আবার খোলা উচিত।
স্কট রিপ্পি

2
কিছু, এটা সদৃশ যেটির stackoverflow.com/questions/4166616/...
স্কট Rippey

1
সেই মন্তব্যে 13 ভোট এবং এখনও পুনরায় খোলা হয়নি ..?!
টিজে

উত্তর:


111

আপনার প্রশ্নে আপনি এটি উল্লেখ করেছেন Both examples seem to do the same thing, এটি মোটেও সত্য নয়, কারণ

আপনার প্রথম উদাহরণ

function SomeBaseClass(){...}
SomeBaseClass.prototype = {
    doThis : function(){...},
    doThat : function(){...}
}
function MyClass(){...}
MyClass.prototype = Object.create(SomeBaseClass.prototype);

এই উদাহরণস্বরূপ, আপনি কেবল উত্তরাধিকার সূত্রে চলেছেন SomeBaseClass' prototypeতবে যদি আপনার SomeBaseClassমতো কোনও সম্পত্তি থাকে তবে কী হবে

function SomeBaseClass(){ 
    this.publicProperty='SomeValue'; 
}

এবং আপনি যদি এটি ব্যবহার করেন

var obj=new MyClass();
console.log(obj.publicProperty); // undefined
console.log(obj);​

objবস্তু থাকবে না publicPropertyমত সম্পত্তি এই উদাহরণে

আপনার দ্বিতীয় উদাহরণ

MyClass.prototype = new SomeBaseClass();

এটি constructorফাংশনটি সম্পাদন করছে , একটি উদাহরণ তৈরি SomeBaseClassকরে পুরো SomeBaseClassবস্তুর উত্তরাধিকারী । সুতরাং, আপনি যদি ব্যবহার

    var obj=new MyClass();
    console.log(obj.publicProperty); // SomeValue
    console.log(obj);​

publicPropertyএক্ষেত্রে এর সম্পত্তিও এই উদাহরণটিরobj মতো বস্তুর কাছে উপলব্ধ ।

যেহেতু Object.createকয়েকটি পুরানো ব্রাউজারগুলিতে এটি উপলভ্য নয়, সে ক্ষেত্রে আপনি ব্যবহার করতে পারেন

if(!Object.create)
{
    Object.create=function(o){
        function F(){}
        F.prototype=o;
        return new F();
    }
}

উপরের কোডটি Object.createযদি না পাওয়া যায় তবে কেবলমাত্র ফাংশন যুক্ত করে যাতে আপনি Object.createফাংশনটি ব্যবহার করতে পারেন এবং আমি মনে করি উপরের কোডটি Object.createআসলে কী করে তা বর্ণনা করে। আশা করি এটি কোনও উপায়ে সহায়তা করবে।


6
হাই শেখ। এই বিষয়ে আপনার প্রচেষ্টার জন্য ধন্যবাদ। হ্যাঁ, পার্থক্য হ'ল কনস্ট্রাক্টর দ্বিতীয় উদাহরণে চালিত হয়েছিল তবে প্রথমটি নয়। (যা আমার ক্ষেত্রে কাম্য)। সুপারি প্রয়োগের ফলে উত্তরাধিকার সূত্রে অনির্ধারিত পাবলিক সম্পত্তি সম্পর্কে আপনার কেবলমাত্র সন্তানের নির্মাতাকে সুপার কল করতে হবে: সামারবেসক্লাস.সকল (এটি)। এই ফিডলটি দেখুন
ক্রিসরিচ

আমি কোনও লাইব্রেরি / ফ্রেমওয়ার্ক ব্যবহার না করে জেএস-তে যথাযথ উত্তরাধিকারের একটি দুর্দান্ত সহজ উপায় খুঁজছি। আমি মনে করি এই উদাহরণটি (উপরের আমার ফিডলে) আধুনিক ব্রাউজারগুলির জন্য সেরা পদ্ধতির। সম্ভবত অবজেক্ট.ক্রিয়েট পলফিল লিগ্যাসি ব্রাউজারগুলির জন্য সমর্থন যোগ করতে পারে?
ক্রিসরিচ

মূলত সংক্ষেপে বলা যায়, আপনি যদি প্রোটোটাইপ = নতুন করেন তবে আপনি বেস ক্লাসে এই দ্বারা নির্ধারিত কোনও মান উত্তরাধিকারী হচ্ছেন, এবং যখন আপনি অবজেক্ট ক্রিয়েট করেন আপনি কেবল বেস ক্লাসে প্রোটোটাইপটিতে যা পেয়েছেন তা হ'ল, তাই না?
ডেভিডজেলসন

এই "মাই ক্লাস.প্রোটোটাইপ = নতুন সামারবেসক্লাস ()" এর অর্থ কি মাই ক্লাসের ইনস্ট্যান্সটি তৈরি করা হয়নি যখন সামারবেসক্লাসের নতুন উদাহরণটি তৈরি করা হয়েছে?

না, আপনি যখন প্রধান বিষয়টি তৈরি করবেন কেবল তখনই প্রোটোটাইপ সেট করা থাকে SomeBaseClass
আলফা

39

উভয় উদাহরণ একই জিনিস করা বলে মনে হচ্ছে।

এটা আপনার ক্ষেত্রে সত্য।

আপনি কখন একজনকে বেছে নেবেন?

যখন SomeBaseClassএকটি ফাংশন বডি থাকে, এটি মূলশব্দ দিয়ে কার্যকর করা হবে new। এটি সাধারণত উদ্দেশ্যে করা হয় না - আপনি কেবল প্রোটোটাইপ চেইন সেট আপ করতে চান। কিছু ক্ষেত্রে এটি গুরুতর সমস্যার কারণও হতে পারে কারণ আপনি আসলে কোনও বস্তুকে ইনস্ট্যান্ট করেন , যার ব্যক্তিগত-স্কোপযুক্ত ভেরিয়েবলগুলি MyClassএকই সুবিধাযুক্ত পদ্ধতির উত্তরাধিকারী হওয়ায় সমস্ত দৃষ্টান্ত দ্বারা ভাগ করা হয় । অন্যান্য পার্শ্ব প্রতিক্রিয়াগুলি কল্পনাযোগ্য।

সুতরাং, আপনার সাধারণত পছন্দ করা উচিত Object.create। তবুও, এটি কিছু লিগ্যাসি ব্রাউজারগুলিতে সমর্থিত নয়; যে কারণে আপনি newঅভিযোজনাকে প্রায়শই ঘন ঘন দেখেন কারণ এটি প্রায়শই (স্পষ্ট) ক্ষতি করে না। এছাড়াও কটাক্ষপাত আছে এই উত্তর


এটি সর্বোত্তম উত্তর, ভাল ব্যাখ্যা
spex

8

পার্থক্য সুস্পষ্ট হয়ে ওঠে যদি আপনি Object.create()এটির মতো করে ব্যবহার করেন। প্রকৃতপক্ষে, এটি prototypeআপনার কোড থেকে শব্দটি পুরোপুরি আড়াল করে it এটি হুডের অধীনে কাজটি করবে। ব্যবহার করে Object.create(), আমরা মত যেতে পারেন

var base =  {
    doThis : function(){
    },

    doThat : function(){
    }
};

এবং তারপরে আমরা এগুলি থেকে অন্যান্য অবজেক্টগুলি প্রসারিত / উত্তরাধিকারী করতে পারি

var myObject = Object.create( base );
// myObject will now link to "base" via the prototype chain internally

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

ব্যবহার করার জন্য এক যুক্তি Object.create()যে এটি আরো দেখুন পারে প্রাকৃতিক করতে মিশ্রিত করা / * উত্তরাধিকারী * অন্যান্য বস্তু থেকে JavaScripts ব্যবহার না করে ডিফল্ট উপায়


7
Object.createnewকোনও নির্মাণকারী ফাংশনের প্রয়োজন হলে শাস্ত্রীয় পদ্ধতির সত্যিকার অর্থে প্রতিস্থাপন করতে পারবেন না
বার্গি

1
এটি অবশ্যই বার্গিকে @ বিস্মৃত করতে পারে। এই ব্লগ পোস্টটি দেখুন: ডেভিডওয়ালস.নেম / জাভাস্ক্রিপ্ট- প্রকল্পগুলি- উন্নয়ন । আপনি অবজেক্ট.ক্রিয়েট () তে দ্বিতীয় প্যারামিটার হিসাবে একটি প্রাথমিককরণ বস্তুটিও পাস করতে পারেন।
লোকালপিসিগুয়ে

@ লোকালপিসিগুয়ে: না এটি পারে না, কারণ Object.createএমন কোনও ফাংশন কল করে না যা ক্লোজার তৈরি করতে প্রয়োজনীয় হবে। অবশ্যই, সঙ্গে Object.createআপনি একটি লাগাতে পারেন initআপনার বস্তু এবং কল পদ্ধতি যা অবিলম্বে এবং এটি এমনকি ফেরৎ thisযাতে আপনি সংক্ষিপ্ত সিনট্যাক্স পেতে - তবে অপেক্ষা করুন, যে হয় একটি কন্সট্রাকটর তারপর।
বার্গি

1
একটি init ফাংশন কল করাও একইভাবে নির্মাণকারীর মতো কাজ করে তবে এটি নির্মাণকারী নয়। এবং এই পদ্ধতিটি আপনাকে অবজেক্ট.ক্রিয়েটের সাথে শাস্ত্রীয় পদ্ধতির হুবহু প্রতিস্থাপন করতে দেয়। এবং অবজেক্টের সংযোগের মানসিক মডেলটি 'নতুন' এর মাধ্যমে তৈরি করা তুলনায় অনেক সহজ।
লোকালপিসিগুয়ে

ভাল, আমার ব্যবহারের মানসিক মডেল new"অবজেক্ট লিঙ্কেজ", তাই খুব বেশি পার্থক্য নেই। প্রকৃতপক্ষে, কেবল দুটি জিনিস রয়েছে: .constructorডাকা হয় .initএবং সেই ফাংশনে .prototypeআপনার প্রোটোটাইপ অবজেক্টের দিকে ফিরে নির্দেশ করার মতো কোনও সম্পত্তি থাকে না । বাকিটি কেবল বাক্য গঠন - এবং আমি new Xতার চেয়ে বেশি পছন্দ করি Object.create(x).init()
বার্গি

0

আমি জাভা স্ক্রিপ্টের বিশেষজ্ঞ নই তবে "অবজেক্ট.ক্রিয়েট" এবং "নতুন" এর মধ্যে পার্থক্য বোঝার জন্য এখানে একটি সাধারণ উদাহরণ রয়েছে ..

পদক্ষেপ 1: কিছু বৈশিষ্ট্য এবং ক্রিয়া সহ পিতামাতার ফাংশন তৈরি করুন ..

function Person() {

this.name = 'venkat';

this.address = 'dallas';

this.mobile='xxxxxxxxxx'

}

Person.prototype.func1 = function () {

    return this.name + this.address;
}

পদক্ষেপ 2: একটি শিশু ফাংশন তৈরি করুন (পার্সোনসারারি) যা নতুন কীওয়ার্ড ব্যবহার করে ব্যক্তি ফাংশনের উপরে প্রসারিত হয় ..

function PersonSalary() {
    Person.call(this);
}
PersonSalary.prototype = new Person();

PersonSalary();

পদক্ষেপ 3: দ্বিতীয় শিশু ফাংশন (পার্সোনলাইভস) তৈরি করুন যা Object.create কীওয়ার্ড ব্যবহার করে ব্যক্তি ফাংশনের উপরে প্রসারিত করে ..

function PersonLeaves() {
 Person.call(this);
}
PersonLeaves.prototype = Object.create(Person.prototype);


PersonLeaves();

// এখন উভয় সন্তানের ফাংশন প্রোটোটাইপ পরীক্ষা করুন।

PersonSalary.prototype
PersonLeaves.prototype

এই উভয় শিশু ফাংশনটি ব্যক্তি (প্যারেন্ট ফাংশন) প্রোটোটাইপের সাথে লিঙ্ক করবে এবং এর পদ্ধতিগুলি অ্যাক্সেস করতে পারে তবে আপনি যদি নতুন ব্যবহার করে চাইল্ড ফাংশন তৈরি করেন তবে এটি সমস্ত প্যারেন্ট বৈশিষ্ট্যগুলির সাথে একটি ব্র্যান্ড নিউ অবজেক্ট ফিরিয়ে দেবে যা আমাদের প্রয়োজন নেই এবং আপনি যখন কোনও তৈরি করেন তখন "নতুন" ব্যবহার করে অবজেক্ট বা ফাংশনটি প্যারেন্ট ফাংশনটি কার্যকর করা হয় যা আমরা হতে চাই না।

এখানে গ্রহণযোগ্য

যদি আপনি কেবল প্যারেন্ট ফাংশনে কিছু পদ্ধতিতে প্রতিনিধিত্ব করতে চান এবং কোনও নতুন অবজেক্ট তৈরি না করতে চান তবে অবজেক্ট.ক্রিট ব্যবহার করা সবচেয়ে ভাল উপায়।

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