2015-12-10 4 views
1

Очень сложно выразить словами, что я хочу, поэтому я написал пример JS, который должен помочь найти точку.Как продлить объект прототипа JavaScript дважды?

http://jsfiddle.net/w8Lfyxtr

// create animal class 
    var animal = function(name) { 
    this.name = name; 
    }; 

    animal.prototype.getSound = function() { 
    return this.sound === undefined ? 'nothing' : this.sound; 
    }; 


    // create animal type classes 
    var dog = new animal("dog"); 
    dog.prototype.sound = "woof"; 

    var cat = new animal("cat"); 
    dog.prototype.sound = "meow"; 

    var worm = new animal("worm"); 


    // create specific animals 
    var spot = new dog(); 
    var mittens = new cat(); 
    var squiggles = new worm(); 

Я хочу создать экземпляры функции JavaScript и расширить прототип несколько раз, так что в моем примере конкретных животных имеют методы и свойства как их рода и общего царства животных.

К сожалению, он появляется после первого запуска, свойство прототипа больше не существует. Я не хочу продолжать распространять его так, чтобы у главного прототипа были все методы для всех животных, червь и собака должны иметь .dig(), а кошка должна иметь .climb() без других классов, имеющих эти методы.

И наоборот, я не хочу постоянно пересматривать методы для каждого экземпляра. Рукавицы должны иметь тот же прототип, что и класс cat, и должны иметь те же самые функциональные объекты, что и Crookshanks cat, без какой-либо дополнительной работы по назначению.

Как достичь этого с помощью моего примера?

+1

Это очень трудно выразить словами, почему, но попробуйте использовать 'Object.create' : http://jsfiddle.net/ykurmangaliyev/w8Lfyxtr/3/. –

+0

Очень интересно. Это также создает другой прототип? – Josh

+0

Эти две статьи могут быть вам интересны: http://stackoverflow.com/questions/13040684/javascript-inheritance-object-create-vs-new и http://stackoverflow.com/questions/4166616/understanding-the- разница между объектами-create-and-new-somefunction –

ответ

1

Вместо создания экземпляра конкретного животного, т.е .: new animal('dog'); создать собаку конструктор:

var Dog = function() { 
    this.sound = 'woof'; 
}; 
Dog.prototype = animal.prototype; 
new Dog(); 

объектов не имеет свойства прототипа, только функции действительно есть.

Вы можете также использовать Object.create:

Dog.prototype = Object.create(animal.prototype); 
+0

«Конструктор собак» - удивительный термин. Я попробую это. – Josh

+0

Похоже, что просто определение прототипа вручную является самым простым способом достижения того, что я хочу, на основе всей полученной мной информации. – Josh

0

Это может быть подходит для ваших нужд:

// create animal class 
    var animal = function(name) { 
    this.name = name; 
    }; 

    animal.prototype.getSound = function() { 
    return this.sound === undefined ? 'nothing' : this.sound; 
    }; 

    var digger = function(name) { 
    animal.call(this, name); 
    this.dig = function() { 
     ... 
    }; 
    } 

    var climber = function(name) { 
    animal.call(this, name); 
    this.climb = function() { 
     ... 
    }; 
    } 

    var dog = function() { 
    } 

    var cat = function() { 
    } 

    var worm = function() { 
    } 

    digger.prototype = new animal(); 
    digger.prototype.constructor = digger; 

    climber.prototype = new animal(); 
    climber.prototype.constructor = climber; 

    dog.prototype = new digger("dog"); 
    dog.prototype.constructor = dog; 
    dog.prototype.sound = "woof"; 

    cat.prototype = new climber("cat"); 
    cat.prototype.constructor = cat; 
    cat.prototype.sound = "meow"; 

    worm.prototype = new digger("worm"); 
    worm.prototype.constructor = worm; 

    // create specific animals 
    var spot = new dog(); 
    var mittens = new cat(); 
    var squiggles = new worm(); 
Смежные вопросы