SORU
12 Kasım 2010, Cuma


Arasındaki farkı anlamak Nesne.() oluşturmak ve yeni SomeFunction()

Geçenlerde bir Nesne üzerine tökezledi.create() yöntemi, JavaScript, ve etmeye çalışıyorum anlamak ne kadar farklı oluşturma Yeni bir örnek, bir nesne ile yeni SomeFunction()', ve ne zaman olacağını kullanmak istiyorsanız bir diğeri.

Düşünün aşağıdaki örnek:

var test = {val: 1, func: function(){ return this.val; }};
var testA = Object.create(test);

testA.val = 2;
console.log(test.func()); // 1
console.log(testA.func()); // 2

console.log('other test');
var otherTest = function(){
    this.val = 1;
    this.func = function(){
        return this.val;
    };
};

var otherTestA = new otherTest();
var otherTestB = new otherTest();
otherTestB .val = 2;
console.log(otherTestA.val); // 1 
console.log(otherTestB.val); // 2

console.log(otherTestA.func()); // 1
console.log(otherTestB.func()); // 2

Aynı davranışı her iki durumda da gözlenen dikkat edin. Bu iki senaryo arasındaki temel farklar nelerdir bana öyle geliyor ki:

  • Nesne Nesne kullanılır.oluşturmak aslında yeni nesnenin prototip formları, yeni bir İşlev olarak nerede ilan özellikleri form/fonksiyon prototipi oluşturmazlar.
  • Olamaz Nesne ile kilitler oluşturun.senin gibi sözdizimi işlev sözdizimi oluşturun. Bu JavaScript (blok vs) sözcük türü kapsamı düşünüldüğünde mantıklı.

Yukarıdaki ifadelerin doğru mu? Ve ben bir şey eksik? Ne zaman diğer üzerinde kullanmak istiyorsunuz?

EDİT: yukarıdaki kod örneği, sürüm jsfiddle linki: http://jsfiddle.net/rZfYL/

CEVAP
12 Kasım 2010, Cuma


Nesne Nesne kullanılır.oluşturmak aslında yeni nesnenin prototip formları, yeni bir İşlev olarak nerede ilan özellikleri form/fonksiyon prototipi oluşturmazlar.

Evet, Object.create oluşturur bir doğrudan bir ilk bağımsız değişken olarak geçirilen nesne o devralır.

Yapıcı fonksiyonları ile, yeni oluşturulan nesnenin kurucu prototip devraldığı, örneğin:

var o = new SomeConstructor();

Yukarıdaki örnek, o doğrudan SomeConstructor.prototype devralır.

İşte fark burada, Object.create oluşturabilirsiniz bir nesne yok miras arası bir şey Object.create(null); diğer yandan, eğer siz bir SomeConstructor.prototype = null; yeni oluşturulan nesne konacak Object.prototype.

Olamaz Nesne ile kilitler oluşturun.senin gibi sözdizimi işlev sözdizimi oluşturun. Bu JavaScript (blok vs) sözcük türü kapsamı düşünüldüğünde mantıklı.

Peki, örneğin özellik tanımlayıcıları argümanı kullanarak: kapaklar oluşturabilirsiniz

var o = Object.create({inherited: 1}, {
  foo: {
    get: (function () { // a closure
      var closured = 'foo';
      return function () {
        return closured 'bar';
      };
    })()
  }
});

o.foo; // "foobar"

Object.create yöntem, Crockford değil shim ECMA 5th Edition bahsediyorum unutmayın.

Bu yöntem doğal olarak yeni tarayıcıları üzerinde uygulanması, compatibility table Bu kontrol olmaya başlıyor.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GoogleTechTalks

    GoogleTechTa

    15 AĞUSTOS 2007
  • Peter Sharp

    Peter Sharp

    11 ŞUBAT 2013
  • Warner Bros. UK

    Warner Bros.

    6 HAZİRAN 2008