17 Mayıs 2016 Salı

Javascript ve Object

Nesne Tanımlama
Nesne aslında bir map. Klasik olarak nesne içindeki property literal : value çifti olarak tanımlanır. Value olarak string, null gibi şeyler kullanılabilir.
myObject = {
  Fname: 'A',
  Mname: null,
  Lname: 'C',
  Email: 'AB@gmail.com',
  Address: null,
  Login: 'AB',
  Active: null
};
Ancak bu tek yöntem değil. Property initializer olarak şu yöntemler makbul
var o = {
 literal:   "A literal, anything that's a valid IdentifierName can be used",
 "string":  "A string, any valid string can be used",
 string2': "Another string, just using single quotes instead of doubles",
 10:        "Numbers are valid, they're converted to strings",
 10.5:      "Even fractional numbers are allowed",
 [name]:    "A computed property name, valid in ES2015+ only; the name of this" +
            "property is 'foo' because the `name` variable has `foo`",
 ["a"+"b"]: "Computed property names really are *computed*, this one is 'ab'",
 [sym]:     "Another computed property name, this one uses a Symbol rather than" +
            "a string"
};
Nesnenin Alanlarına Erişme
Alanlara literal şeklinde erişilebilir. Alan bir dizi ise indeks'te kullanmak gerekir. Buraya kadar olan kısım diğer programlama dilleri ile aynı. Şöyle bir nesnemiz olsun
var o = {
    name: "alex",
    pets: [
        {
            name: "felix",
            type: "dog"
        },
        {
            name: "fluffy",
            type: "cat"
        }
    ]
};
Bu nesneye şöyle erişiriz.
console.log(o.name);         // "alex"
console.log(o.pets[0].name); // "felix"
console.log(o.pets[0].type); // "dog"
console.log(o.pets[1].name); // "fluffy"
console.log(o.pets[1].type); // "cat"
Alan Ekleme ve Silme
Elimizde şöyle bir nesne olsun
{"id":5, "name": "Jordin Sparks}
id alanını num, name alanını ise fullname olarak değiştirmek istersek yani şöyle olsun istersek
{"num":5, "fullname": "Jordin Sparks"}
delete ile alanı sileriz.
var obj = ...;
obj.num = obj.id; //Alan ekle
obj.fullname = obj.name; //Alan ekle
delete obj.id; //Alan sil
delete obj.name; //Alan sil

Function
Javascript'te nesnelere geçmeden önce function'ı anlamak gerekir. Function'lar oldukça esnektir. Biz geçilmesini istediğimiz parametre sayısını tanımlasak bile, daha az veya daha çok parametre ile de çağrılabilirler.
function test(label, a, b) {
...
}
test("test1", 1, 2);
test("test2", 1);
test("test3");
test("test4", 1, 2, 3, 4);
function'a geçilen parametrelere arguments ile erişilebilir. Yukarıdaki test metodunda şunu yapabilirdik.
function test(label, a, b) {
  
  if (arguments.length > 3) {
    
    for (n = 3; n < arguments.length; ++n) {
      snippet.log("#" + n + ": " + arguments[n]);
    }
  }
}
Eğer parametre geçilmemizse undefined gelir.
function deletePrompt(message, callback) {
  
  if (message !== undefined) {
  ...
  }

  if (callback !== undefined) {
  ... 
  };   
}

Prototype ile Member Method
Prototype kullanan basit bir örnek şöyle
function Person(name) {
  this.name = name;
}
Person.prototype.sayName = function() {
  console.log("My name is " + name);
}

var john = new Person("John");

john.sayName();
Prototype Kullanmadan Member Method
Basit bir örnek şöyle. Yukarıdaki gibi prototype kullanarak member method tanımlamak bu yönteme göre daha hızlı.
function Animal(){
    this.name = 'rover';
    this.set_name = function(name){
         this.name = name;
    }
}

Object Klonlama
Örnekte obj nesnesin Object.assign() ile kopyası alınıyor. Daha sonra delete ile bir alanı siliniyor.
const doSomething = (obj, prop) => {
  let res = Object.assign({}, obj)
  delete res[prop]
  return res
}
Bu metodu şöyle kullanırız.
let o = {firstname: 'Jane', lastname: 'Doe'};
let o2 = doSomething(o, 'lastname');
console.log(o.lastname); // 'Doe'
console.log(o2.lastname); // undefined
Array ve Alan Ekleme
Örnekte array nesnesine alan ekleniyor.  Aslında yapılan şey aynı bir HashMap'e değer eklemek gibi ancak ben hatırlaması kolay olsun diye alan eklenmiş gibi düşünüyorum. Alan eklendiği için length değeri halen 0 döner.
var balances = [];
balances['kanav'] = 50;
balances['yash'] = 50;

alert(balances.length);
console.log(balances);
Örnekte array nesnesine yine alan ekleniyor.
// Add plain object properties
arr.foo = 'foo';
arr.bar = 'bar';

Alanlarını Dolaşma - Object.keys
Bir Object'in tüm alanları şöyle dolaşılır. Eğer alan null ise alana boş string değeri atanır.
// Get array of keys of the object
// Loop over it
Object.keys(myObject).forEach(function(e) {

  // If value of the object member is `null` set it to `''` - empty string.
  if (myObject[e] === null)
    myObject[e] = '';
});

console.log(myObject);
document.write('<pre>' + JSON.stringify(myObject, 0, 2) + '</pre>');
Alanlarını Dolaşma - for in
Şöyle de yapılabilir
for (var key in o){...}
Elimizde şöyle  bir nesne olsun
x = {"Sam": 5, "Billy": 9, "Joe": 3}
for(var name in x){
    document.getElementById("output").innerHTML+=(name+": "+x[name]+"  ");
}
Ancak bu yöntem de dikkatli olmak lazım. Alanlar sıralı gelmiyor. Ayrıca kalıtımla gelen alanları da görebiliyor. Bunları elemek istersek şöyle yaparız.
for(var name in obj) {
  if (obj.hasOwnProperty(name)) {
    // DO STUFF
  }
}




Hiç yorum yok:

Yorum Gönder