SORU
8 EKİM 2011, CUMARTESİ


javascript sınıf/statik yöntem?

Bunun işe yarayacağını biliyorum

function Foo() {};
Foo.prototype.talk = function () {
    alert('hello~\n');
};

var a = new Foo;
a.talk(); // 'hello~\n'

Ama eğer aramak istiyorum

Foo.talk() // this will not work
Foo.prototype.talk() // this works correctly

Bazı yöntemler Foo.talk çözüm buluyorum

  1. Foo.__proto__ = Foo.prototype
  2. Foo.talk = Foo.prototype.talk

Bazıları yolu bunu yapmak için vardır? Bunu yapmak için doğru olup olmadığını bilmiyorum. class method ya da javascript kod static method kullanıyor musunuz?

CEVAP
8 EKİM 2011, CUMARTESİ


Öncelikle, JavaScript öncelikli olduğunu unutmayın prototypal language yerine class-based language1. Foo bir nesne olan bir sınıf, fonksiyon, değil. Bir nesne oluşturmakdansana bir şey standart OOP bir dille benzer bir sınıf oluşturmak için izin verecek new anahtar işlevini kullanarak.

Zavallı tarayıcı desteği çapraz ve prototype nasıl çalıştığı hakkında öğrenme odaklanmak yerine, çünkü __proto__ görmezden gelmek çoğu zaman öneririm.

Bir nesne bir işlev oluşturulan bir örnek varsa2ve size erişim bir üyesinin yöntemleri, nitelikleri, özellikleri, sabitler, vb) herhangi bir şekilde erişecek akış aşağı prototip hiyerarşi kadar da (a) bulur üyesi, veya (b) bulamazsa başka bir prototip.

Hiyerarşi denen nesne başlar, ve sonra prototip nesne arar. Eğer prototip nesnesi bir prototip varsa, tekrarlar, hiçbir prototip varsa, undefined döndürülür.

Örneğin:

foo = {bar: 'baz'};
alert(foo.bar); //alerts "baz"

foo = {};
alert(foo.bar); //alerts undefined

function Foo(){}
Foo.prototype = {bar: 'baz'};
f = new Foo();
alert(f.bar);
//alerts "baz" because the object f doesn't have an attribute "bar"
//so it checks the prototype
f.bar = 'buzz';
alert( f.bar ); //alerts "buzz" because f has an attribute "bar" set

En azından biraz bu "" zaten, ama onları açık yapmak için sadece emin olmak istiyorum. parçaların temel anladığını da bana öyle geliyor

JavaScript, her şey bir nesnedir3.

her şeyibir nesnedir.

function Foo(){} sadece yeni bir fonksiyon tanımlamaz, erişilen Foo kullanarak yeni bir işlev nesnesi tanımlar.

Bu Foo'Foo.prototype. s prototip erişebilirsiniz yüzden

Ne de yapabilirsiniz ayarlanırdaha fazla işlevleriFoo:

Foo.talk = function () {
  alert('hello world!');
};

Bu yeni özelliği kullanarak erişilebilir:

Foo.talk();

Şimdi fonksiyon bir nesne üzerinde fonksiyonları ve statik bir yöntem arasında bir benzerlik fark ediyorsun ki?.

Sınıf için ortak bir yöntem tanımlama ve Foo.baz = function(){...} sınıf için public static bir yöntem tanımlama gibi bir sınıf örneği, Foo.prototype.bar = function(){...} oluşturma f = new Foo(); düşün.


1: class was a "Future Reserved Word" in the ECMAScript 5 specification ama ES6 sınıfları class anahtar kelime kullanarak tanımlama olanağı sunar.

2: aslında bir sınıf örneği bir kurucu tarafından oluşturulan, ama seni yanıltmak istemem çok ince farklılıklar vardır

3:,** *31 *30, booleans, sayılar ve dizeler-dahil primitive values -;; düşük düzey dil uygulamaları çünkü onlar teknik olarak nesneler değil. Boolean değerleri, sayıları, ve dizeleri hala etkileşim ile prototip zinciri sanki onlar nesneleri, amaçları bu cevap, daha da kolaylaşır düşünün onlara "nesne" olsa bile, onlar değil.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Numberphile

    Numberphile

    15 EYLÜL 2011
  • Pituvision

    Pituvision

    11 Mart 2006
  • Press Start

    Press Start

    4 HAZİRAN 2006