2011-06-16 19 views
15

Mozilla Geliştirici Merkezi'nde, Function.prototype.bind işleviyle ilgili bir sayfa vardır ve bu işlevi desteklemeyen tarayıcılar için bir uyumluluk işlevi sağlar. Ancak, bu uyumluluk kodunu analiz ederken neden instanceof nop numaralı telefonu kullandığını bulamıyorum. Üste | nop, function() {} olarak ayarlanmıştır. bind'daki ECMA spesifikasyonunun hangi kısmı buna denk geliyor? Ve hangi değişkenler function() {} örneğidir?'instanceof function() {}' kullanımının arkasındaki sebep nedir?

Aşağıdakiler false'u döndürür, dolayısıyla ne için kullanıldığını tam olarak bilmiyorum. instanceof function() {} kontrolünde ne gibi şeyler geri dönüyor? aşağıdaki gibi

(function() {}) instanceof (function() {}) // false 

kodudur:

Function.prototype.bind = function(obj) { 
    if(typeof this !== 'function') 
     throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); 

    var slice = [].slice, 
     args = slice.call(arguments, 1), 
     self = this, 
     nop = function() {}, 
     bound = function() { 
      return self.apply(this instanceof nop ? this : (obj || {}), 
           args.concat(slice.call(arguments)));  
     }; 

    bound.prototype = this.prototype; 

    return bound; 
}; 

cevap

8

Birisi kullanışlı hale getirir bölümünü düzenlenebilir. mozilla's bind function question: Burada aynı şeyi (ama ne zaman kod doğru) soruyordu başka soruyu yanıtladı

Function.prototype.bind = function(obj) { 
    var slice = [].slice, 
    args = slice.call(arguments, 1), 
    self = this, 
    nop = function() {}, 
    bound = function() { 
     return self.apply(this instanceof nop ? this : (obj || {}), 
          args.concat(slice.call(arguments)));  
    }; 

    // These lines are the important part 
    nop.prototype = self.prototype; 
    bound.prototype = new nop(); 

    return bound; 
}; 

: Burada benziyor derdi. Eğer bir yapıcı (yani new operatör ile) olarak bağlı işlev çağırırsanız, this yerine yeni bir nesneye bağlı olduğunu sen bind geçirilen her ne nedenle

this instanceof nop kontrol için nedenidir.

Bir yapıcı olarak işlev çağrısı böylece nop temelde prototip zincirinin içine yerleştirilir oluyor, "önemli bir rol" açıklamak için, this nop bir örneğidir.

Eğer var bound = original.bind(someObject); çalıştırmak Yani eğer prototip zinciri aşağıdaki gibi görünecektir:

 
    original 
    | 
    nop 
    | 
    bound 

onlar nop yerine this instanceof self kullanılan niçin Benim tahminim bağlı fonksiyon kendi prototype mülkü olurdu böylece (yani devralır self 's). Kısmen düzenlenmiş olmasının nedeninin mümkün olmadığı düşünülüyor olabilir. Yine de, şu andaki kod doğru değildir, ancak işlevi bir kurucu olarak kullanmadığınız sürece çalışacaktır.

3

o uygulamasıyla bir hata var gibi görünüyor. nop hiçbir zaman (herhangi bir şeyi başlatmak için) instanceof kontrolünü beklemez (bu hiçbir şey için hiçbir zaman doğru olamaz) çünkü hiçbir nesne bu kapağın derinliklerine gömülmüş olan nop'dan hiçbir zaman başlatılamaz.

bu düşünün:

// Identical definition, but different Function instances 
var nop = function() {}, 
    mop = function() {}; 

var obj1 = new mop; 

obj1 instanceof mop // true 
obj1 instanceof nop // false