Soru oldukça eski, ancak soyut "sınıf" ın nasıl yaratılacağı ve bu tür nesnelerin nasıl oluşturulacağı konusunda bazı olası çözümler yarattım.
//our Abstract class
var Animal=function(){
this.name="Animal";
this.fullname=this.name;
//check if we have abstract paramater in prototype
if (Object.getPrototypeOf(this).hasOwnProperty("abstract")){
throw new Error("Can't instantiate abstract class!");
}
};
//very important - Animal prototype has property abstract
Animal.prototype.abstract=true;
Animal.prototype.hello=function(){
console.log("Hello from "+this.name);
};
Animal.prototype.fullHello=function(){
console.log("Hello from "+this.fullname);
};
//first inheritans
var Cat=function(){
Animal.call(this);//run constructor of animal
this.name="Cat";
this.fullname=this.fullname+" - "+this.name;
};
Cat.prototype=Object.create(Animal.prototype);
//second inheritans
var Tiger=function(){
Cat.call(this);//run constructor of animal
this.name="Tiger";
this.fullname=this.fullname+" - "+this.name;
};
Tiger.prototype=Object.create(Cat.prototype);
//cat can be used
console.log("WE CREATE CAT:");
var cat=new Cat();
cat.hello();
cat.fullHello();
//tiger can be used
console.log("WE CREATE TIGER:");
var tiger=new Tiger();
tiger.hello();
tiger.fullHello();
console.log("WE CREATE ANIMAL ( IT IS ABSTRACT ):");
//animal is abstract, cannot be used - see error in console
var animal=new Animal();
animal=animal.fullHello();
Gördüğünüz gibi, son nesne bize hata veriyor, çünkü prototipteki Animal özelliğine sahip abstract
. Hayvan olduğundan emin olmak için Animal.prototype
prototip zincirinde olan bir şey değil :
Object.getPrototypeOf(this).hasOwnProperty("abstract")
Bu yüzden en yakın prototip nesnemin abstract
özelliğe sahip olup olmadığını kontrol ediyorum , yalnızca doğrudan Animal
prototipten oluşturulan nesnenin bu koşulu true'da olacak. İşlev hasOwnProperty
, prototiplerini değil yalnızca mevcut nesnenin özelliklerini kontrol eder, bu nedenle bu bize özelliğin prototip zincirinde değil burada bildirildiğinden% 100 emin olur.
Object'ten türetilen her nesne hasOwnProperty yöntemini miras alır . Bu yöntem, bir nesnenin belirtilen özelliğe, o nesnenin doğrudan bir özelliği olarak sahip olup olmadığını belirlemek için kullanılabilir; in operatörünün aksine, bu yöntem nesnenin prototip zincirini kontrol etmez. Bununla ilgili daha fazlası:
Benim önerime göre, @ Jordão'nun mevcut en iyi cevabında olduğu gibi constructor
her seferinde değişmemiz gerekmiyor Object.create
.
Çözüm ayrıca hiyerarşide birçok soyut sınıf oluşturmayı sağlar, sadece abstract
prototipte özellik oluşturmamız gerekir .