همه نوشته‌های حامد مرادی

الگوهای طراحی جاوا اسکریپت

الگوی سازنده

در زبانهای برنامه نویسی شیء گرای کلاسیک، یک سازنده یک متد خاص است که برای ایجاد اولیه ی یک شیء در جایی از حافظه که برای آن اختصاص داده شده استفاده می شود. در جاوا اسکریپت، تقریبا همه چیز شیء هستند. ما هم بیشتر علاقمند به سازنده های شیء هستیم.
سازنده های شیء برای ایجاد نوع خاصی از از اشیاء استفاده می شوند که هم شیء را برای استفاده آماده می کنند و هم آرگمان هایی که یک سازنده برای ثبت مقادیر اعضای پروپرتی ها ومتد ها هنگام ایجاد اولیه شیء می تواند استفاده کند را می پذیرند.

در جاوا اسکریپت اشیاء را می توان با سه روش ایجاد نمود:

هر کدام از مثال های زیر یک شیء خالی می سازند

//var newObject = {};
 یا
//var newObject = Object.create( Object.prototype );
 یا
//var newObject = new Object();

چهار روشی که می توان مقادیر را به یک شیء نسبت داد :

// ۱٫ Dot syntax

// Set properties
newObject.someKey = "Hello World";

// Get properties
var value = newObject.someKey;

// 2. Square bracket syntax

// Set properties
newObject["someKey"] = "Hello World";

// Get properties
var value = newObject["someKey"];

// ECMAScript 5 only compatible approaches
// For more information see: http://kangax.github.com/es5-compat-table/

// 3. Object.defineProperty

// Set properties
Object.defineProperty( newObject, "someKey", {
    value: "for more control of the property's behavior",
    writable: true,
    enumerable: true,
    configurable: true
});

// If the above feels a little difficult to read, a short-hand could
// be written as follows:

var defineProp = function ( obj, key, value ){
  var config = {
    value: value,
    writable: true,
    enumerable: true,
    configurable: true
  };
  Object.defineProperty( obj, key, config );
};

// To use, we then create a new empty "person" object
var person = Object.create( Object.prototype );

// Populate the object with properties
defineProp( person, "car",  "Delorean" );
defineProp( person, "dateOfBirth", "1981" );
defineProp( person, "hasBeard", false );

console.log(person);
// Outputs: Object {car: "Delorean", dateOfBirth: "1981", hasBeard: false}

// 4. Object.defineProperties

// Set properties
Object.defineProperties( newObject, {

  "someKey": {
    value: "Hello World",
    writable: true
  },

  "anotherKey": {
    value: "Foo bar",
    writable: false
  }

});

// Getting properties for 3. and 4. can be done using any of the
// options in 1. and 2.

این متدها حتی می توانند برای ارث بری استفاده شوند:

// Create a race car driver that inherits from the person object
var driver = Object.create( person );

// Set some properties for the driver
defineProp(driver, "topSpeed", "100mph");

// Get an inherited property (1981)
console.log( driver.dateOfBirth );

// Get the property we set (100mph)
console.log( driver.topSpeed );

سازنده های ساده

همانطور که می دانیم جاوا اسکریپت از مفاهیم کلاس پشتیبانی نمی کند، اما از توابع سازنده خاص که با اشیاء کار می کنند پشتیبانی می کند. با یک صدا زدن ساده ی یک تابع سازنده که با کلمه کلیدی new شروع می شود ما می توانیم به جاوا اسکریپت بگوییم که ما می خواهیم تابع شبیه یک سازنده رفتار کند و یک شیء جدید را با اعضایی که بوسیله ی خود تابع تعیین می شوند معرفی نماییم.

داخل یک سازنده، کلمه کلیدی this مرجع شیء جدیدی است که ساخته می شود. بازنگری ایجا د شی در یک سازنده ساده می تواند به صورت زیر باشد:

function Car( model, year, miles ) {

  this.model = model;
  this.year = year;
  this.miles = miles;

  this.toString = function () {
    return this.model + " has done " + this.miles + " miles";
  };
}

// We can create new instances of the car
var civic = new Car( "Honda Civic", 2009, 20000 );
var mondeo = new Car( "Ford Mondeo", 2010, 5000 );

// and then open our browser console to view the
// output of the toString() method being called on
// these objects
console.log( civic.toString() );
console.log( mondeo.toString() );

کدهای بالا یک نسخه ی ساده از یک الگوی سازنده هستند ولی هنوز کمی مشکل دارند، یکی از مشکلات این است که ایجاد ارث بری در آن سخت است و دیگر آن که توابعی مثل ()toString دوباره برای هر شیء جدیدی که از سازنده ی Car استفاده می کنند ایجاد می شوند. این برای تابعی که در نهایت بین همه ی موارد Car اشتراک گذاری می شود خیلی بهینه نیست.

ترجمه از کتاب Addy Osmani