5

Bir JavaScript nesnesinin Google Closure inheritance mechanism kullanarak bir arabirimin uygulanması olup olmadığını nasıl sınayabilirim?Nesnenin Google Closure sınıf çerçevesindeki arabirim uygulaması olup olmadığını sınama


ben işe yaramadı new my.Dog() ve object instanceof my.Animal yoluyla oluşturulan nesneleri my.Animal herhangi bir ipucu bulamadık. Arabirim hakkında tek bilgi, alt sınıftaki yöntemleri uygulamak için unutmadan derleyici hatalarıdır. Bulduğum

/** 
* @interface 
*/ 
my.Animal = function() {}; 

/** 
* Does something. 
* @return {string} 
*/ 
my.Animal.prototype.doSomething; 

/** 
* @constructor 
* @implements {my.Animal} 
*/ 
my.Dog = function() {}; 

/** @inheritDoc */ 
my.Dog.prototype.doSomething() = function { 
    return "something"; 
} 

var dog = new my.Dog(); 
console.log(dog instanceof my.Animal); // returns false 

bir yolu böylece birçok konuda kötü olsa arayüzleri özelliği için yaklaşık teste geçerli:

console.log(!!dog.doSomething); // returns true 
+2

Neyin yanlış olduğuna dair bir yorum almayı çok isterim. –

cevap

2

@interface. Derlenmemiş kodda, çalışma zamanı denetimleri için herhangi bir kablo eklemek üzere @interface/@implements için yorumları denetleyebilecek hiçbir şey yoktur. Kapanış hedefi, kodun derlemeden önce ve sonra aynı şekilde çalışmasıdır (kullandığınız optimizasyon modu için kısıtlamayı gözlemlediğiniz varsayılarak). nerede görmüyorum böylece bu biraz can sıkıcı sonra

my.Dog.prototype.implements_my_Animal = true; 

if (foo.implements_my_Animal) ... 

: Bir çalışma zamanı onay istendiği tipik desen ilgileniyorsunuz arabirimini uygulayan sınıf etiketlemektir buna gerek yok. Bunu sarmanın çeşitli yolları vardır, ancak GELİŞMİŞ modunu kullanırsanız, çoğunun kullanılmadığı takdirde çıkarılması ve çıkarılmaması nedeniyle uygulama sınıfında (örneğinizdeki my.Dog) sonuçlanır.

+0

Not: Muhtemelen true yerine bir sentinel nesnesi eklemeli ve eşdeğerliği kontrol etmelisiniz, örneğin (foo.implements_my_Animal === the_object) 'gibi bir nesne varsa, bir nesne aynı anahtarı tanımlamak için yanlış pozitif sonuç alırsınız. Bu foo.a gibi bir şeye yeniden adlandırılan ileri derlemeden sonra kolayca gerçekleşebilir. Clojurescript'te karşılaştığımız bir şey: https://dev.clojure.org/jira/browse/CLJS-1658 – ClojureMostly

1

doğrudan olamaz.

Kapatma derleyici türü sistemde, @extends, kalıtım için kullanılır ve instanceof testleriyle ilişkilendirir. @implements ile belirtilen arayüz uygulamaları kesinlikle bir derleme zamanı kontrolüdür. Nesnenin, arabirimin tanımlarıyla eşleşen yöntemler ve özellikler içerdiğine dair bir söz vardır. Bu nedenle, çalışma zamanında kapsamlı bir şekilde test etmek için, arabirimin her bir özelliğinin varlığını ve türünü kontrol etmeniz gerekir. Sadece bir tip denetleyici yapısı olan