JavaScript'te bir sınıfı tanımlamak için hangi teknikler kullanılabilir ve bunların ödünleşimleri nelerdir?


686

OOP'u şu anda üzerinde çalıştığım gibi büyük ölçekli projelerde kullanmayı tercih ediyorum. JavaScript'te birkaç sınıf oluşturmam gerekiyor, ancak yanılmıyorsam, bunu yapmanın en az birkaç yolu var. Sözdizimi ne olurdu ve neden bu şekilde yapılsın?

En azından başta üçüncü taraf kitaplıkları kullanmaktan kaçınmak istiyorum.
Diğer yanıtları ararken JavaScript ile Nesneye Yönelik Programlama, Bölüm I: Kalıtım - Doc JavaScript'de nesne tabanlı programlamayı tartışan makaleyi buldum . Kalıtım yapmanın daha iyi bir yolu var mı?



3
Şahsen, sınıfın fonksiyon gövdesi içinde bildirilmesini seviyorum. Daha çok bir sınıf gibi davranmasını sağlamak için 'bu sorunu düzeltmek' tekniğini kullanıyorum. Blogumda ayrıntılı bir örnek var: ncombo.wordpress.com/2012/12/30/…
Jon

C ++ OOP işlevlerinin çoğunu basit ve doğal bir sözdizimiyle JavaScript'e taşıdım. Cevabımı burada görebilirsiniz: stackoverflow.com/a/18239463/1115652

JavaScript'te hiç sınıf yok. Ancak JS'de sınıf benzeri davranışı simüle etmek istiyorsanız, bunu yapabilirsiniz. : Ayrıntılara bakın symfony-world.blogspot.com/2013/10/...
ducin

Yanıtlar:


743

Herhangi bir harici kitaplık kullanmadan bunu yapmanın yolu:

// Define a class like this
function Person(name, gender){

   // Add object properties like this
   this.name = name;
   this.gender = gender;
}

// Add methods like this.  All Person objects will be able to invoke this
Person.prototype.speak = function(){
    alert("Howdy, my name is" + this.name);
};

// Instantiate new objects with 'new'
var person = new Person("Bob", "M");

// Invoke methods like this
person.speak(); // alerts "Howdy, my name is Bob"

Şimdi gerçek cevap bundan çok daha karmaşık. Örneğin, JavaScript'te sınıf diye bir şey yoktur. JavaScript prototypetabanlı bir kalıtım şeması kullanır .

Buna ek olarak, JavaScript'te sınıf benzeri işlevlere yaklaşmak için kendi tarzlarına sahip çok sayıda popüler JavaScript kitaplığı vardır. En azından Prototip ve jQuery'ye göz atmak isteyeceksiniz .

Bunlardan hangisinin "en iyi" olduğuna karar vermek Stack Overflow'da kutsal bir savaş başlatmak için harika bir yoldur. Daha büyük bir JavaScript ağır projeye başlıyorsanız, kesinlikle popüler bir kütüphaneyi öğrenmeye ve kendi yollarına yapmaya değer. Ben bir Prototip adamım, ama Stack Overflow jQuery'ye yaslanmış gibi görünüyor.

Dış kütüphanelere bağımlılık olmadan, sadece "bunu yapmanın bir yolu" olduğu sürece, yazdığım yöntem hemen hemen budur.


48
Ama nesne dili yapmak için kullanılan bir şeyin işe yaraması gereken tek gerçek yolu öğrendiğim X dili gibi çalışmıyor :(
Erik Reppen

2
Developer.mozilla.org/tr-TR/docs/Web/JavaScript/… 'a göre , özellikler prototipe de eklenmelidir ("Person.prototype.name =' ';")
DaveD

1
@DaveD - belki de oldu, ama artık görünmüyor ..?
Kieren Johnstone

6
jQuery sınıf benzeri işlevsellik oluşturmak için herhangi bir yol bile sağlamaz ??? (Sahip olduğu tüm sınıflar CSS sınıflarıdır) Cevabın o kısmından kaldırmalısınız.
Bergi

7
2015 EcmaScript 6'nın ikinci yarısından itibaren yeni standart yayınlandı, bu yüzden bunu yeni bir şekilde yapmayı öneriyorum (çok daha temiz ve daha kolay) es6-features.org/#ClassDefinition
DevWL

213

JavaScript'te bir sınıf tanımlamanın en iyi yolu bir sınıf tanımlamamaktır.

Ciddi anlamda.

Nesneye yönelik birkaç farklı lezzet vardır, bazıları:

  • sınıf tabanlı OO (ilk olarak Smalltalk tarafından tanıtıldı)
  • prototip tabanlı OO (ilk olarak Self tarafından tanıtıldı)
  • multimetod tabanlı OO (ilk olarak CommonLoops tarafından tanıtıldı, sanırım)
  • yüklem tabanlı OO (fikir yok)

Ve muhtemelen bilmediğim diğerleri.

JavaScript prototip tabanlı OO uygular. Prototip tabanlı OO'da, diğer nesneler (sınıf şablonundan başlatılmak yerine) kopyalanarak yeni nesneler oluşturulur ve yöntemler sınıflar yerine doğrudan nesnelerde yaşar. Devralma, yetki devri yoluyla yapılır: bir nesnenin yöntemi veya özelliği yoksa, prototip (leri) (yani klonlandığı nesne), sonra da prototipin prototipleri vb.

Başka bir deyişle: sınıf yok.

JavaScript'in aslında bu modelde hoş bir ayarı var: yapıcılar. Nesneleri sadece mevcut olanları kopyalayarak oluşturmakla kalmaz, aynı zamanda “ince havadan” da yapılandırabilirsiniz. newAnahtar kelimeyle bir işlevi çağırırsanız , bu işlev bir kurucu olur ve thisanahtar kelime geçerli nesneyi değil, yeni oluşturulan "boş" bir nesneyi gösterir. Böylece, bir nesneyi istediğiniz gibi yapılandırabilirsiniz. Bu şekilde, JavaScript kurucuları geleneksel sınıf tabanlı OO'daki sınıf rollerinden birini üstlenebilir: yeni nesneler için şablon veya ayrıntılı bir şablon görevi görür.

Artık JavaScript çok güçlü bir dildir, bu nedenle isterseniz JavaScript'e sınıf tabanlı bir OO sistemi uygulamak oldukça kolaydır . Ancak, bunu sadece Java'nın böyle yaptığı için değil, sadece gerçekten bir ihtiyacınız varsa yapmalısınız.


Msgstr "" "Yeni anahtar kelimeyle bir işlev çağırırsanız, bu işlev yapıcı olur ve bu anahtar kelime geçerli nesneyi değil, yeni oluşturulan" boş "bir nesneyi gösterir. Yeni anahtar sözcüğü olmayan bir işlevi çağırırsanız, bu varsayılan olarak genel nesneyi (pencere) çağıran bağlamı ifade eder. Katı modda, tanımsız varsayılan değerdir. call, Apply ve bind, çağrı bağlamını ilk parametre olarak alır. developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/…
Elias Hasle

83

ES2015 Sınıfları

ES2015 spesifikasyonunda, prototip sistemi üzerinde sadece şeker olan sınıf sözdizimini kullanabilirsiniz.

class Person {
  constructor(name) {
    this.name = name;
  }
  toString() {
    return `My name is ${ this.name }.`;
  }
}

class Employee extends Person {
  constructor(name, hours) {
    super(name);
    this.hours = hours;
  }
  toString() {
    return `${ super.toString() } I work ${ this.hours } hours.`;
  }
}

Yararları

Temel faydası, statik analiz araçlarının bu sözdizimini hedeflemeyi daha kolay bulmasıdır. Sınıf temelli dillerden gelen başkalarının da dili çoklu dil olarak kullanması daha kolaydır.

Uyarılar

Mevcut sınırlamalarına karşı dikkatli olun. Özel özellikler elde etmek için , Semboller veya WeakMaps kullanmaya başvurulmalıdır . Gelecek sürümlerde, sınıflar büyük olasılıkla bu eksik özellikleri içerecek şekilde genişletilecektir.

Destek

Tarayıcı desteği şu anda çok iyi değil (IE hariç neredeyse herkes tarafından destekleniyor), ancak bu özellikleri şimdi Babel gibi bir transpiler ile kullanabilirsiniz .

kaynaklar


56

Daniel X. Moore'u kullanmayı tercih ederim {SUPER: SYSTEM}. Bu, gerçek örnek değişkenleri, özellik tabanlı kalıtım, sınıf hiyerarşileri ve yapılandırma seçenekleri gibi faydalar sağlayan bir disiplindir. Aşağıdaki örnek, en büyük avantaj olduğunu düşündüğüm gerçek örnek değişkenlerinin kullanımını göstermektedir. Örnek değişkenlere ihtiyacınız yoksa ve yalnızca genel veya özel değişkenlerden memnunsanız, muhtemelen daha basit sistemler vardır.

function Person(I) {
  I = I || {};

  Object.reverseMerge(I, {
    name: "McLovin",
    age: 25,
    homeState: "Hawaii"
  });

  return {
    introduce: function() {
      return "Hi I'm " + I.name + " and I'm " + I.age;
    }
  };
}

var fogel = Person({
  age: "old enough"
});
fogel.introduce(); // "Hi I'm McLovin and I'm old enough"

Vay be, bu tek başına çok kullanışlı değil, ancak bir alt sınıf eklemeye bir göz atın:

function Ninja(I) {
  I = I || {};

  Object.reverseMerge(I, {
    belt: "black"
  });

  // Ninja is a subclass of person
  return Object.extend(Person(I), {
    greetChallenger: function() {
      return "In all my " + I.age + " years as a ninja, I've never met a challenger as worthy as you...";
    }
  });
}

var resig = Ninja({name: "John Resig"});

resig.introduce(); // "Hi I'm John Resig and I'm 25"

Diğer bir avantaj modül ve özellik tabanlı kalıtım yeteneğidir.

// The Bindable module
function Bindable() {

  var eventCallbacks = {};

  return {
    bind: function(event, callback) {
      eventCallbacks[event] = eventCallbacks[event] || [];

      eventCallbacks[event].push(callback);
    },

    trigger: function(event) {
      var callbacks = eventCallbacks[event];

      if(callbacks && callbacks.length) {
        var self = this;
        callbacks.forEach(function(callback) {
          callback(self);
        });
      }
    },
  };
}

Kişi sınıfına örnek olarak, çiftlenebilir modül verilebilir.

function Person(I) {
  I = I || {};

  Object.reverseMerge(I, {
    name: "McLovin",
    age: 25,
    homeState: "Hawaii"
  });

  var self = {
    introduce: function() {
      return "Hi I'm " + I.name + " and I'm " + I.age;
    }
  };

  // Including the Bindable module
  Object.extend(self, Bindable());

  return self;
}

var person = Person();
person.bind("eat", function() {
  alert(person.introduce() + " and I'm eating!");
});

person.trigger("eat"); // Blasts the alert!

Açıklama: Ben Daniel X. Moore'um ve bu benim {SUPER: SYSTEM}. JavaScript'te bir sınıf tanımlamanın en iyi yoludur.


@DanielXMoore "Örnek değişkenleri bir sınıfın tek tek örnekleri arasında paylaşılır" Bunlar örnek değişkenleri değil, bunlar statik / sınıf değişkenleridir.
JAB

2
@JAB Bu yanlıştır, statik / sınıf değişkenleri bir sınıfın tüm örnekleri arasında paylaşılır . Her örneğin kendi örnek değişkenleri vardır.
Daniel X Moore

(Bir değişkeni değişken olsun ya da olmasın, "örnek değişkeni" teriminin normal anlamını kullanarak başka bir deyişle, değişkenin erişilebilirlik düzeyine dikeydir.)
JAB

2
Neredeyse en iyi xD
iddiası

Javascript nesnelerini kullanarak bir Javascript sınıfı tanımlamak için kolay bir yaklaşım: wapgee.com/story/i/203
Ilyas karim

41
var Animal = function(options) {
    var name = options.name;
    var animal = {};

    animal.getName = function() {
        return name;
    };

    var somePrivateMethod = function() {

    };

    return animal;
};

// usage
var cat = Animal({name: 'tiger'});

Bu, hiçbir şey almak zorunda kalmadan kullanılabilir bir nesne yapısı oluşturmanın çok zarif bir yoludur. Resig'in sınıf sistemini kullanıyordum, ama bunu daha iyi beğenebilirim. Teşekkür ederim.
Tim Scollick

29
Bu yaklaşımla ilgili sorun, yeni bir Animal örneği oluşturduğunuzda, işlevleri yalnızca bir kez prototiple tanımlamak yerine yeniden tanımlayacağıdır.
Justin

33

Javascript'te şimdiye kadar kullandığım nesneler oluşturmanın yolları

Örnek 1:

obj = new Object();
obj.name = 'test';
obj.sayHello = function() {
    console.log('Hello '+ this.name);
}

Örnek 2:

obj = {};
obj.name = 'test';
obj.sayHello = function() {
    console.log('Hello '+ this.name);
}
obj.sayHello();

Örnek 3:

var obj = function(nameParam) {
    this.name = nameParam;
}
obj.prototype.sayHello = function() {
    console.log('Hello '+ this.name);
}

Örnek 4: Object.create () yönteminin gerçek faydaları. lütfen bu bağlantıya bakın

var Obj = {
    init: function(nameParam) {
        this.name = nameParam;
    },
    sayHello: function() {
        console.log('Hello '+ this.name);
    }
};
var usrObj = Object.create(Obj);  // <== one level of inheritance

usrObj.init('Bob');
usrObj.sayHello();

Örnek 5 (özelleştirilmiş Crockford'un Object.create):

Object.build = function(o) {
   var initArgs = Array.prototype.slice.call(arguments,1)
   function F() {
      if((typeof o.init === 'function') && initArgs.length) {
         o.init.apply(this,initArgs)
      }
   }
   F.prototype = o
   return new F()
}
MY_GLOBAL = {i: 1, nextId: function(){return this.i++}}  // For example

var userB = {
    init: function(nameParam) {
        this.id = MY_GLOBAL.nextId();
        this.name = nameParam;
    },
    sayHello: function() {
        console.log('Hello '+ this.name);
    }
};
var bob = Object.build(userB, 'Bob');  // Different from your code
bob.sayHello();


ES6 / ES2015 ile yanıtı güncel tutmak için

Bir sınıf şöyle tanımlanır:

class Person {
    constructor(strName, numAge) {
        this.name = strName;
        this.age = numAge;
    }

    toString() {
        return '((Class::Person) named ' + this.name + ' & of age ' + this.age + ')';
    }
}

let objPerson = new Person("Bob",33);
console.log(objPerson.toString());

1
@Justin: Lütfen neyin geçerli olmadığını bana bildirin.
Amol M Kulkarni

Bu notasyonları incelerken, buna da rastladım. Set (). Örneğin: bu .set ('port', 3000). Benim tahminim, bu nesne için port özelliğini ayarlamak için kullanılır. Öyleyse, neden doğrudan kullanmıyoruz: {port: 3000}. Daha fazla bilgi alabileceğim herhangi bir belge var mı?
adityah

24

Ben Douglas Crockford en okumak gerektiğini düşünüyorum JavaScript Kalıtım ve JavaScript Klasik Kalıtım .

Sayfasından örnekler:

Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
};

Etki? Yöntemleri daha zarif bir şekilde eklemenizi sağlar:

function Parenizor(value) {
    this.setValue(value);
}

Parenizor.method('setValue', function (value) {
    this.value = value;
    return this;
});

Videolarını da öneririm: Gelişmiş JavaScript .

Sayfasında daha fazla video bulabilirsiniz: http://javascript.crockford.com/ John Reisig kitabında Douglas Crockfor'un web sitesinde birçok örnek bulabilirsiniz.


25
Sadece ben mi? Bu ne kadar zarif? Fonksiyon tanımlarını gerçek 'strings'olarak adlarla birçok şey olarak adlandırırdım, ama zarif bunlardan biri değil ...
fgysin Monica'yı yeniden canlandırdı

4
@JAB, ancak yansıma kural değil istisnadır. Yukarıdaki yöntemle, tüm yöntemlerinizi dizelerle bildirmeniz gerekir .
Kirk Woll

16

YUI / Crockford fabrika planını kabul etmeyeceğim ve işleri kendi içinde ve genişletilebilir tutmayı sevdiğim için bu benim varyasyonum:

function Person(params)
{
  this.name = params.name || defaultnamevalue;
  this.role = params.role || defaultrolevalue;

  if(typeof(this.speak)=='undefined') //guarantees one time prototyping
  {
    Person.prototype.speak = function() {/* do whatever */};
  }
}

var Robert = new Person({name:'Bob'});

ideal olarak typeof testi ilk prototiplenen yöntem gibi bir şey üzerinde


Bunu sevdim. Çoğu zaman JS'nin standart sözdizimini kullanıyorum, çünkü fonksiyonları her nesne örneğine kopyalama fikrinden hoşlanmıyorum. Kendine yeten çözümün güzelliğini her zaman özledim ve bu oldukça iyi çözüyor.
Lukasz Korzybski

1
Emin değilim ama bir işlevin kapsamı içinde (bir şekilde bir kapatma gibi) prototip işlev tanımlamanın, çöp toplayıcı bu sınıflar örneğinde oraya gelemediğinden bellek sızıntısıyla sonuçlandığını anladım.
Sanne

15

Basit olanı seçiyorsanız, "yeni" anahtar kelimeden tamamen kaçınabilirsiniz ve yalnızca fabrika yöntemlerini kullanabilirsiniz. Bunu bazen tercih ederim, çünkü nesne oluşturmak için JSON kullanmayı seviyorum.

function getSomeObj(var1, var2){
  var obj = {
     instancevar1: var1,
     instancevar2: var2,
     someMethod: function(param)
     {  
          //stuff; 
     }
  };
  return obj;
}

var myobj = getSomeObj("var1", "var2");
myobj.someMethod("bla");

Yine de büyük nesneler için performans vuruşunun ne olduğundan emin değilim.


İç nesnenin getSomeObj () parametrelerine erişimi olacağından obj.instancevar1 = var1 satırı gerekli değildir.
Triptych

Vay. Bu beynimi incitir ama belli bir zarafeti vardır. Yani "obj.instancevar1 = var1" kısmı bir çeşit kurucunun başlangıcı, sanırım?
Karim

Triptych'in yorumunu yeni gördüm. Anlıyorum. Böylece, iç nesnenin somutlaştırıldığı "instancevar1: var1" gibi bir şey yapabilirsiniz.
Karim

Tam olarak ... bir nesneyi tanımlamak için {} kullandığınızda, o anda kapsamda olan değişkenlere erişimi vardır.
Sam

10
Bu yaklaşımla, miras alma yeteneğini kaybedersiniz ve obj.prototype.something kullanmadığınızdan, nesneyi her kullandığınızda işlevleri tanımlarsınız = daha fazla bellek ve daha yavaş.
bazı

12
var Student = (function () {
    function Student(firstname, lastname) {
        this.firstname = firstname;
        this.lastname = lastname;
        this.fullname = firstname + " " + lastname;
    }

    Student.prototype.sayMyName = function () {
        return this.fullname;
    };

    return Student;
}());

var user = new Student("Jane", "User");
var user_fullname = user.sayMyName();

Bu, TypeScript'in kurucu ile sınıfı JavaScript'e derlemesinin yolu.


10

Basit yol:

function Foo(a) {
  var that=this;

  function privateMethod() { .. }

  // public methods
  that.add = function(b) {
    return a + b;
  };
  that.avg = function(b) {
    return that.add(b) / 2; // calling another public method
  };
}

var x = new Foo(10);
alert(x.add(2)); // 12
alert(x.avg(20)); // 15

Bunun nedeni that, thisolay işleyici olarak bir yöntem verirseniz başka bir şeye bağlanabilmenizdir, böylece örneği oluşturma sırasında değeri kaydedip daha sonra kullanırsınız.

Düzenleme: kesinlikle en iyi yol değil, sadece basit bir yol. Ben de iyi cevaplar bekliyorum!


1
Bu = bu yapı burada gerekli değildir. Ayrıca, add () ve avg () yöntemleri, aralarında paylaşılmak yerine, Foo sınıfının her "örneği" için kopyalanacaktır.
Triptych

1
Bu durumda gerekli (sorta), ancak sağladığınız basit durumda değil.
Triptik

9

Muhtemelen Katlama Deseni'ni kullanarak bir tür oluşturmak istiyorsunuz:

    // Here is the constructor section.
    var myType = function () {
        var N = {}, // Enclosed (private) members are here.
            X = this; // Exposed (public) members are here.

        (function ENCLOSED_FIELDS() {
            N.toggle = false;
            N.text = '';
        }());

        (function EXPOSED_FIELDS() {
            X.count = 0;
            X.numbers = [1, 2, 3];
        }());

        // The properties below have access to the enclosed fields.
        // Careful with functions exposed within the closure of the
        // constructor, each new instance will have it's own copy.
        (function EXPOSED_PROPERTIES_WITHIN_CONSTRUCTOR() {
            Object.defineProperty(X, 'toggle', {
                get: function () {
                    var before = N.toggle;
                    N.toggle = !N.toggle;
                    return before;
                }
            });

            Object.defineProperty(X, 'text', {
                get: function () {
                    return N.text;
                },
                set: function (value) {
                    N.text = value;
                }
            });
        }());
    };

    // Here is the prototype section.
    (function PROTOTYPE() {
        var P = myType.prototype;

        (function EXPOSED_PROPERTIES_WITHIN_PROTOTYPE() {
            Object.defineProperty(P, 'numberLength', {
                get: function () {
                    return this.numbers.length;
                }
            });
        }());

        (function EXPOSED_METHODS() {
            P.incrementNumbersByCount = function () {
                var i;
                for (i = 0; i < this.numbers.length; i++) {
                    this.numbers[i] += this.count;
                }
            };
            P.tweak = function () {
                if (this.toggle) {
                    this.count++;
                }
                this.text = 'tweaked';
            };
        }());
    }());

Bu kod size myType adlı bir tür verecektir . Geçiş ve metin adı verilen dahili özel alanlara sahip olacaktır . Aynı zamanda bu maruz üyeden oluşacak: alanları saymak ve sayıları ; özellikler arasında geçiş , metin ve numberLength ; yöntemleri artışNumbersByCount ve tweak .

Katlama Deseni burada tamamen ayrıntılıdır: Javascript Katlama Deseni


3

@ Liammclennan'ın cevabı için golf kodunu yazınız .

var Animal = function (args) {
  return {
    name: args.name,

    getName: function () {
      return this.name; // member access
    },

    callGetName: function () {
      return this.getName(); // method call
    }
  };
};

var cat = Animal({ name: 'tiger' });
console.log(cat.callGetName());


2

MooTools (Nesneye Yönelik Araçlarım) sınıflar fikrine odaklanmıştır . Kalıtımla bile genişletebilir ve uygulayabilirsiniz.

Ustalaştığında gülünç olarak yeniden kullanılabilir, güçlü bir javascript yapar.


2

Miras Alan Nesne Tabanlı Sınıflar

var baseObject = 
{
     // Replication / Constructor function
     new : function(){
         return Object.create(this);   
     },

    aProperty : null,
    aMethod : function(param){
      alert("Heres your " + param + "!");
    },
}


newObject = baseObject.new();
newObject.aProperty = "Hello";

anotherObject = Object.create(baseObject); 
anotherObject.aProperty = "There";

console.log(newObject.aProperty) // "Hello"
console.log(anotherObject.aProperty) // "There"
console.log(baseObject.aProperty) // null

Basit, tatlı ve halledilir.


1

Bir baz

function Base(kind) {
    this.kind = kind;
}

Bir sınıf

// Shared var
var _greeting;

(function _init() {
    Class.prototype = new Base();
    Class.prototype.constructor = Class;
    Class.prototype.log = function() { _log.apply(this, arguments); }
    _greeting = "Good afternoon!";
})();

function Class(name, kind) {
    Base.call(this, kind);
    this.name = name;
}

// Shared function
function _log() {
    console.log(_greeting + " Me name is " + this.name + " and I'm a " + this.kind);
}

Aksiyon

var c = new Class("Joe", "Object");
c.log(); // "Good afternoon! Me name is Joe and I'm a Object"

1

Triptych örneğine dayanarak, bu daha da basit olabilir:

    // Define a class and instantiate it
    var ThePerson = new function Person(name, gender) {
        // Add class data members
        this.name = name;
        this.gender = gender;
        // Add class methods
        this.hello = function () { alert('Hello, this is ' + this.name); }
    }("Bob", "M"); // this instantiates the 'new' object

    // Use the object
    ThePerson.hello(); // alerts "Hello, this is Bob"

Bu yalnızca tek bir nesne örneği oluşturur, ancak bir sınıftaki değişken ve yöntemler için bir grup adı kapsüllemek istiyorsanız yine de yararlıdır. Normalde yapıcı için "Bob, M" argümanları olmazdı, örneğin yöntemler veritabanı veya ağ gibi kendi verileri olan bir sisteme çağrılacaksa.

JS ile bunun neden bir prototypeşey kullanmadığını görmek için hala çok yeniyim .


0

JavaScript nesne yönelimlidir , ancak Java, C # veya C ++ gibi diğer OOP dillerinden kökten farklıdır . Böyle anlamaya çalışmayın. Bu eski bilgiyi atın ve yeniden başlayın. JavaScript'in farklı bir düşünceye ihtiyacı var.

Konuyla ilgili iyi bir el kitabı veya başka bir şey almanızı öneririm. Çerçeveyi okumadan önce veya sonra kullanmama rağmen, ExtJS Tutorials'ı kendim için en iyi buldum . Ancak JavaScript dünyasında ne olduğu hakkında iyi bir açıklama yapıyor. Maalesef, içeriğin kaldırıldığı anlaşılıyor. Bunun yerine archive.org copy bağlantısı var . Bugün çalışıyor. : P


2
Nesne odaklı? İşlevsel olduğunu düşündüm .
Peter Mortensen

"ExtJS Öğreticileri" bağlantısı bozuk.
Peter Mortensen

Ben javascript fonksiyonları nesne olduğunu açıklamak için daha açıklayıcı olacağını ve javascript parantez kapsam kuralları her fonksiyon blok kapsülleme yapmak.
mibbit

-1

//new way using this and new
function Persons(name) {
  this.name = name;
  this.greeting = function() {
    alert('Hi! I\'m ' + this.name + '.');
  };
}

var gee=new Persons("gee");
gee.greeting();

var gray=new Persons("gray");
gray.greeting();

//old way
function createPerson(name){
 var obj={};
 obj.name=name;
 obj.greeting = function(){
 console.log("hello I am"+obj.name);
 }; 
  return obj;
}

var gita=createPerson('Gita');
gita.greeting();

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.