নোডজেএস-এ জাভাস্ক্রিপ্ট ওওপি: কীভাবে?


118

আমি জাভা হিসাবে ক্লাসিকাল OOP অভ্যস্ত।

নোডজেএস ব্যবহার করে জাভাস্ক্রিপ্টে ওওপি করার সেরা অনুশীলনগুলি কী কী?

প্রতিটি ক্লাস একটি ফাইল আছে module.export?

ক্লাস কিভাবে তৈরি করবেন?

this.Class = function() {
    //constructor?
    var privateField = ""
    this.publicField = ""
    var privateMethod = function() {}
    this.publicMethod = function() {} 
}

বনাম (আমি নিশ্চিত যে এটি সঠিক)

this.Class = {
    privateField: ""
    , privateMethod: function() {}

    , return {
        publicField: ""
        publicMethod: function() {}
    }
}

বনাম

this.Class = function() {}

this.Class.prototype.method = function(){}

...

উত্তরাধিকার কীভাবে কাজ করবে?

নোডজেএসে ওওপি বাস্তবায়নের জন্য নির্দিষ্ট মডিউল রয়েছে?

ওওপির সাথে সাদৃশ্যপূর্ণ জিনিসগুলি তৈরি করতে আমি হাজার হাজার বিভিন্ন উপায় খুঁজে পাচ্ছি .. তবে সর্বাধিক ব্যবহৃত / ব্যবহারিক / পরিষ্কার উপায় কী তা আমার কোনও ধারণা নেই।

বোনাস প্রশ্ন : মঙ্গুজজেএস-এর সাথে ব্যবহারের জন্য প্রস্তাবিত "ওওপি স্টাইল" কী? (কোনও মঙ্গুজজেএস ডকুমেন্টকে কি ক্লাস হিসাবে দেখা যাবে এবং উদাহরণ হিসাবে ব্যবহৃত মডেল?)

সম্পাদনা

এখানে জেএসফিডেলের একটি উদাহরণ রয়েছে দয়া করে প্রতিক্রিয়া জানান।

//http://javascriptissexy.com/oop-in-javascript-what-you-need-to-know/
function inheritPrototype(childObject, parentObject) {
    var copyOfParent = Object.create(parentObject.prototype)
    copyOfParent.constructor = childObject
    childObject.prototype = copyOfParent
}

//example
function Canvas (id) {
    this.id = id
    this.shapes = {} //instead of array?
    console.log("Canvas constructor called "+id)
}
Canvas.prototype = {
    constructor: Canvas
    , getId: function() {
        return this.id
    }
    , getShape: function(shapeId) {
        return this.shapes[shapeId]
    }
    , getShapes: function() {
        return this.shapes
    }
    , addShape: function (shape)  {
        this.shapes[shape.getId()] = shape
    }
    , removeShape: function (shapeId)  {
        var shape = this.shapes[shapeId]
        if (shape)
            delete this.shapes[shapeId]
        return shape
    }
}

function Shape(id) {
    this.id = id
    this.size = { width: 0, height: 0 }
    console.log("Shape constructor called "+id)
}
Shape.prototype = {
    constructor: Shape
    , getId: function() {
        return this.id
    }
    , getSize: function() {
        return this.size
    }
    , setSize: function (size)  {
        this.size = size
    }
}

//inheritance
function Square(id, otherSuff) {
    Shape.call(this, id) //same as Shape.prototype.constructor.apply( this, arguments ); ?
    this.stuff = otherSuff
    console.log("Square constructor called "+id)
}
inheritPrototype(Square, Shape)
Square.prototype.getSize = function() { //override
    return this.size.width
}

function ComplexShape(id) {
    Shape.call(this, id)
    this.frame = null
    console.log("ComplexShape constructor called "+id)
}
inheritPrototype(ComplexShape, Shape)
ComplexShape.prototype.getFrame = function() {
    return this.frame
}
ComplexShape.prototype.setFrame = function(frame) {
    this.frame = frame
}

function Frame(id) {
    this.id = id
    this.length = 0
}
Frame.prototype = {
    constructor: Frame
    , getId: function() {
        return this.id
    }
    , getLength: function() {
        return this.length
    }
    , setLength: function (length)  {
        this.length = length
    }
}

/////run
var aCanvas = new Canvas("c1")
var anotherCanvas = new Canvas("c2")
console.log("aCanvas: "+ aCanvas.getId())

var aSquare = new Square("s1", {})
aSquare.setSize({ width: 100, height: 100})
console.log("square overridden size: "+aSquare.getSize())

var aComplexShape = new ComplexShape("supercomplex")
var aFrame = new Frame("f1")
aComplexShape.setFrame(aFrame)
console.log(aComplexShape.getFrame())

aCanvas.addShape(aSquare)
aCanvas.addShape(aComplexShape)
console.log("Shapes in aCanvas: "+Object.keys(aCanvas.getShapes()).length)

anotherCanvas.addShape(aCanvas.removeShape("supercomplex"))
console.log("Shapes in aCanvas: "+Object.keys(aCanvas.getShapes()).length)
console.log("Shapes in anotherCanvas: "+Object.keys(anotherCanvas.getShapes()).length)

console.log(aSquare instanceof Shape)
console.log(aComplexShape instanceof Shape)

12
নোড.জেএস তে ওও জেএস সম্পর্কে সত্যই নির্দিষ্ট কিছু নেই এখানে কেবল ওও জেএস আছে। আপনার প্রশ্নটি জেএস-তে জাভা ওওপি কৌশলগুলি অনুবাদ করার বিষয়ে যা সঠিক নয় । আমি মনে করি আপনি জেএস এর প্রোটোটাইপ-ভিত্তিক মডেল কীভাবে কাজ করেন এবং আপনি কীভাবে এটি আপনার সুবিধার্থে ব্যবহার করতে পারেন তা শিখতে আপনি একই সময় / শক্তি ব্যয় করেছেন ভাল
এলিয়াস ভ্যান ওটেজেম

1
এছাড়াও, আপনার জাভাস্ক্রিপ্টে ক্লাস নেই। আপনি ফাংশন দিয়ে শ্রেণীর মতো আচরণ তৈরি করতে পারেন তবে এটি সাধারণত ভাল ধারণা নয়।
m_vdbeek

1
@ আওকেজোল্ডিক আপনি "দেশীয় বৈশিষ্ট্য" নয় এর অর্থ কী?
ইসাইলিজা

4
@ ফুসিও সাধারণভাবে প্রোটোটাইপাল উত্তরাধিকারের সাথে, অবজেক্টস / দৃষ্টান্তগুলি অন্যান্য অবজেক্ট / দৃষ্টান্ত থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়। সুতরাং, ক্লাসগুলি ব্যবহার করা হয়নি কারণ আপনি বিমূর্ত সংজ্ঞা দিয়ে কাজ করছেন না। সুতরাং, উত্তরাধিকার একটি মাধ্যমে সম্পন্ন করা হয় prototypeশৃঙ্খল । এবং, না, অবজেক্ট " প্রাইভেট " সদস্যদের সমর্থন করে না । নোড.জেএস-তে মডিউল / স্ক্রিপ্টগুলি ক্লোজার হিসাবে প্রয়োগ করা হলেও কেবল ক্লোজারগুলি এটি সরবরাহ করতে পারে।
জোনাথন লোনোস্কি

1
@ ইসাইলিজা বলতে আসলে আমার বোঝার অর্থ এই নয় যে ক্লোজারগুলি ব্যক্তিগত সদস্য তৈরি করতে পারে। আপনি কেবল জাভাস্ক্রিপ্টে যেভাবে ক্লোজার এবং সংযুক্ত ভেরিয়েবলগুলি পেতে পারেন তার কাছাকাছি প্রস্তাব দিচ্ছিলেন । তবে, অন্য অংশের জন্য: কেবলমাত্র " বাস্তবায়ন " আমি নোড মডিউলগুলি বিবেচনা করেছি, যা এমন একটি ক্লোজারের মধ্যে মূল্যায়ন করা হয় যেখানে কয়েকটি স্ক্রিপ্টের জন্য কিছু গ্লোবালকে অনন্য সংজ্ঞায়িত করা হয়।
জোনাথন লোনোস্কি

উত্তর:


116

এটি বাক্সের বাইরে কাজ করে এমন একটি উদাহরণ। আপনি যদি কম "হ্যাকি" চান তবে আপনার উত্তরাধিকার গ্রন্থাগার বা এ জাতীয় ব্যবহার করা উচিত।

ভাল একটি ফাইল এ্যানিমাল। জজে আপনি লিখতে হবে:

var method = Animal.prototype;

function Animal(age) {
    this._age = age;
}

method.getAge = function() {
    return this._age;
};

module.exports = Animal;

এটি অন্য ফাইলে ব্যবহার করতে:

var Animal = require("./animal.js");

var john = new Animal(3);

আপনি যদি "সাব ক্লাস" চান তবে মাউস.জেএস এর ভিতরে:

var _super = require("./animal.js").prototype,
    method = Mouse.prototype = Object.create( _super );

method.constructor = Mouse;

function Mouse() {
    _super.constructor.apply( this, arguments );
}
//Pointless override to show super calls
//note that for performance (e.g. inlining the below is impossible)
//you should do
//method.$getAge = _super.getAge;
//and then use this.$getAge() instead of super()
method.getAge = function() {
    return _super.getAge.call(this);
};

module.exports = Mouse;

এছাড়াও আপনি উল্লম্ব উত্তরাধিকারের পরিবর্তে "পদ্ধতি ধার করা" বিবেচনা করতে পারেন। আপনার ক্লাসে এর পদ্ধতিটি ব্যবহার করার জন্য আপনার "শ্রেণি" থেকে উত্তরাধিকারের প্রয়োজন নেই। এই ক্ষেত্রে:

 var method = List.prototype;
 function List() {

 }

 method.add = Array.prototype.push;

 ...

 var a = new List();
 a.add(3);
 console.log(a[0]) //3;

ভিতরে ব্যবহার করার Animal.prototype.getAge= function(){}এবং কেবল যুক্ত করার মধ্যে পার্থক্য কী ? সাব-ক্লাসটি কিছুটা হ্যাকিং বলে মনে হচ্ছে .. "উত্তরাধিকার" লাইব্রেরির সাথে আপনি কি বোঝাচ্ছেন @adsyntax দ্বারা প্রস্তাবিত মতো ? this.getAge = function(){}function Animal() {}inherits
fusio

4
@ ফুসিও হ্যাঁ, আপনি inherits(Mouse, Animal);উত্তরাধিকারটি সেট আপটি কিছুটা সাফ করার মতো কিছু করতে পারেন । পার্থক্যটি হ'ল আপনি প্রতিটি ফাংশন ভাগ করার পরিবর্তে প্রতিটি তাত্ক্ষণিক বস্তুর জন্য নতুন ফাংশন পরিচয় তৈরি করছেন। আপনার যদি 10 টি ইঁদুর থাকে তবে আপনি 10 টি ফাংশন পরিচয় তৈরি করেছেন (এটি কেবল কারণ মাউসের একটি পদ্ধতি রয়েছে, যদি এটির 10 টি পদ্ধতি থাকে, 10 ইঁদুর 100 টি ফাংশন সনাক্তকরণ তৈরি করে, আপনার সার্ভারটি খুব শীঘ্রই তার সিপিইউটির বেশিরভাগ জিসি: পি তে নষ্ট করবে) , যদিও আপনি এগুলি কোনও কিছুর জন্য ব্যবহার করবেন না। ভাষার বর্তমানে এটি অপ্টিমাইজ করার মতো যথেষ্ট অভিব্যক্তিপূর্ণ শক্তি নেই।
ইসাইলিজা

ওহো। ধন্যবাদ :) এটি বেশ সহজ বলে মনে হচ্ছে, আমি বিশদ_ও_এই_অবজেক্ট_মোডেলটি পেয়েছি যেখানে তারা জেএসের সাথে জাভা তুলনা করে। তবুও, উত্তরাধিকার সূত্রে তারা কেবল Mouse.prototype = new Animal()এইভাবে করে : .. এটি কীভাবে আপনার উদাহরণের সাথে তুলনা করে? (উদাঃ কী Object.create()?)
ফুসিও

@ ফুসিও অবজেক্ট.ক্রিয়েট কনস্ট্রাক্টরকে ডাকে না ... যদি কনস্ট্রাক্টরের পার্শ্ব প্রতিক্রিয়া বা এরকম কিছু থাকে (এটি জাভা থেকে আলাদা কোনও সাধারণ কাজ করতে পারে), তবে উত্তরাধিকার শৃঙ্খলা স্থাপন করার সময় এটি অনিচ্ছুক।
ইসাইলিজা

3
আমি এখনও বজায় রেখেছি যে কেউ জাভাস্ক্রিপ্ট ব্যবহার করা শুরু করছেন, তার মতো সমাধান হ্যাক করা ভাল সমাধান নয়। ডিবাগ করা খুব সহজ নয় যে এগুলি পরামর্শ দেওয়া উচিত নয় ir
m_vdbeek

43

নোড.জে সম্প্রদায়টি জাভাস্ক্রিপ্টের ইসিএমএ-262 স্পেসিফিকেশন থেকে নতুন বৈশিষ্ট্যগুলি সময়মতো নোড.জেএস বিকাশকারীদের কাছে আনার বিষয়টি নিশ্চিত করে।

আপনি জাভাস্ক্রিপ্ট ক্লাস এক নজরে নিতে পারেন । জেএস ক্লাসে MDN লিঙ্ক ECMAScript Java জাভাস্ক্রিপ্ট ক্লাস চালু করা হয়েছে, এই পদ্ধতিটি জাভাস্ক্রিপ্টে OOP ধারণাগুলির মডেল করার সহজ উপায় সরবরাহ করে।

দ্রষ্টব্য : জেএস ক্লাসগুলি কেবল কঠোর মোডে কাজ করবে

নীচে ক্লাসের কিছু কঙ্কাল রয়েছে, নোড.জেএস-এ লেখা উত্তরাধিকার (ব্যবহৃত নোড.জেএস সংস্করণ v5.0.0 )

শ্রেণীর ঘোষণা:

'use strict'; 
class Animal{

 constructor(name){
    this.name = name ;
 }

 print(){
    console.log('Name is :'+ this.name);
 }
}

var a1 = new Animal('Dog');

উত্তরাধিকার:

'use strict';
class Base{

 constructor(){
 }
 // methods definitions go here
}

class Child extends Base{
 // methods definitions go here
 print(){ 
 }
}

var childObj = new Child();

14

আমি inheritsস্ট্যান্ডার্ড utilমডিউলটি সহকারে আসা সহায়কটি ব্যবহার করার পরামর্শ দিচ্ছি : http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor

লিঙ্কযুক্ত পৃষ্ঠায় এটি কীভাবে ব্যবহার করা যায় তার একটি উদাহরণ রয়েছে।


মূল নোডজেএস এনভায়রনমেন্টের ক্ষেত্রে এটি সবচেয়ে সহায়ক উত্তর।
ফিলজেন

1
দেখে মনে হচ্ছে এখন হ্রাস করা হয়েছে। উত্তরের লিঙ্ক থেকে: দ্রষ্টব্য: Use.inherits () এর ব্যবহার নিরুত্সাহিত করা হয়েছে। ভাষা স্তরের উত্তরাধিকার সমর্থন পেতে দয়া করে ES6 শ্রেণিটি ব্যবহার করুন এবং কীওয়ার্ডগুলি প্রসারিত করুন। এছাড়াও লক্ষ করুন যে দুটি শৈলী শব্দার্থগতভাবে বেমানান।
ফ্রস্টি জেড

11

এটি ইন্টারনেটে অবজেক্ট-ওরিয়েন্টেড জাভাস্ক্রিপ্ট সম্পর্কে সেরা ভিডিও:

অবজেক্ট-ওরিয়েন্টেড জাভাস্ক্রিপ্টের সংজ্ঞা নির্দেশিকা

শুরু থেকে শেষ অবধি দেখুন !!

মূলত, জাভাস্ক্রিপ্ট একটি প্রোটোটাইপ-ভিত্তিক ভাষা যা জাভা, সি ++, সি # এবং অন্যান্য জনপ্রিয় বন্ধুদের তুলনায় একেবারে আলাদা। ভিডিওটি এখানে যে কোনও উত্তরের চেয়ে মূল ধারণাগুলি অনেক ভাল ব্যাখ্যা করেছে।

ES6 (প্রকাশিত 2015) এর সাথে আমরা একটি "শ্রেণি" কীওয়ার্ড পেয়েছি যা জাভাস্ক্রিপ্টের "ক্লাস" ব্যবহার করতে দেয় যেমন জাভা, সি ++, সি #, সুইফট ইত্যাদি with

জাভাস্ক্রিপ্ট শ্রেণি / সাবক্লাস কীভাবে লিখবেন এবং ইনস্ট্যান্ট করবেন তা দেখানো ভিডিওর স্ক্রিনশট: এখানে চিত্র বর্ণনা লিখুন


আমি আপনাকে ES6 এর জন্য একটি উত্তর সরবরাহ করায় প্রশংসা করি। ধন্যবাদ! দুর্ভাগ্যক্রমে, আমার কাছে 27 মিনিটের ভিডিও দেখার ডেটা নেই। আমি লিখিত দিকনির্দেশনার জন্য আমার অনুসন্ধান চালিয়ে যাব।
tim.rohrer

ভিডিওটির জন্য ধন্যবাদ আমি জাভাস্ক্রিপ্ট সম্পর্কে আমার অনেক প্রশ্ন সাফ করতে সাহায্য করেছিল।
কিশোর দেবরাজ

4

জাভাস্ক্রিপ্ট সম্প্রদায়ের মধ্যে প্রচুর লোক যুক্তি দেয় যে ওওপি ব্যবহার করা উচিত নয় কারণ প্রোটোটাইপ মডেল স্থানীয়ভাবে কঠোর এবং শক্তিশালী ওওপি করতে দেয় না। তবে আমি মনে করি না যে ওওপি ল্যাঙ্গেজের বিষয় নয় বরং স্থাপত্যের বিষয়।

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


-1

আপনি যদি নিজের মতো করে কাজ করছেন এবং আপনি জাভা বা সি # বা সি ++ তে যেমন OOP এর নিকটতম জিনিসটি দেখতে চান তবে জাভাস্ক্রিপ্ট লাইব্রেরি দেখুন, CRxOop। CrxOop জাভা বিকাশকারীদের কিছুটা পরিচিত সিনট্যাক্স সরবরাহ করে।

শুধু সাবধান হন, জাভাস্ক্রিপ্টে জাভার ওওপি পাওয়া যায় নি। জাভা হিসাবে একই আচরণ পেতে, CrxOop এর কাঠামো ব্যবহার করুন, CrxOop এর কাঠামো নয় এবং নিশ্চিত করুন যে আপনার সমস্ত পদ্ধতি ভার্চুয়াল are সিনট্যাক্সের একটি উদাহরণ হ'ল

crx_registerClass("ExampleClass", 
{ 
    "VERBOSE": 1, 

    "public var publicVar": 5, 
    "private var privateVar": 7, 

    "public virtual function publicVirtualFunction": function(x) 
    { 
        this.publicVar1 = x;
        console.log("publicVirtualFunction"); 
    }, 

    "private virtual function privatePureVirtualFunction": 0, 

    "protected virtual final function protectedVirtualFinalFunction": function() 
    { 
        console.log("protectedVirtualFinalFunction"); 
    }
}); 

crx_registerClass("ExampleSubClass", 
{ 
    VERBOSE: 1, 
    EXTENDS: "ExampleClass", 

    "public var publicVar": 2, 

    "private virtual function privatePureVirtualFunction": function(x) 
    { 
        this.PARENT.CONSTRUCT(pA);
        console.log("ExampleSubClass::privatePureVirtualFunction"); 
    } 
}); 

var gExampleSubClass = crx_new("ExampleSubClass", 4);

console.log(gExampleSubClass.publicVar);
console.log(gExampleSubClass.CAST("ExampleClass").publicVar);

কোডটি খাঁটি জাভাস্ক্রিপ্ট, কোনও স্থানান্তরকারী নয়। অফিসিয়াল ডকুমেন্টেশন থেকে উদাহরণটি বেশ কয়েকটি উদাহরণ থেকে নেওয়া হয়েছে।

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