2016-10-29 6 views
0

Пытаясь понять inheritnace в JavaScript и полностью запуталсяКак наследовать анонимные функции javascript, назначенные переменным?

мне просто нужно что DogCat иметь bark и meow функции и возможность доступа this (так или иначе) каждого объекта в наследство цепи:

var cat = function() { this.name = "tom"; this.cat_instance = this; } 
    var dog = function() { this.name = "bob"; this.dog_instance = this; console.log("cat is here!");} 

    cat.prototype.meow = function() { console.log("mhew"); } 
    dog.prototype.bark = function() { console.log("whoof"); } 

    var DogCat = function() { 
     DogCat.prototype = dog.prototype; 
     DogCat.constructor = cat; 
     console.log("my name is " + this.dog_instance + " " + this.cat_instance); 
    } 

Так DogCat.prototype теперь (должен?) указывать на прототип dog и, например, DogCat Я должен был получить как минимум bark функцию, но экземпляр не имеет этой функции.

Хорошо тот беспорядок (на мой взгляд), я стараюсь в настоящее время применяются как наследуемые конструкторы к ребенку:

var DogCat = function() { 
     cat.apply(this); 
     dog.apply(this); 
     console.log("my name is " + this.dog_instance + " " + this.cat_instance); 
    } 

Затем указать прототип собаке:

DogCat.prototype = dog.prototype; 
    var d = new DogCat(); 
    > cat is here! 
    >my name is [object Object] [object Object] 

сейчас Я могу получить доступ к bark, но как работать с функцией meow? Как правильно построить прототипы?

UPD

жаль в DogCat должен быть DogCat.prototype = dog.prototype, фиксированная

+1

Первое правило прототипов: [Никогда не назначать их внутри конструктора] (http://stackoverflow.com/q/21296559/1048572). Второе правило JS-прототипов: нет [множественного наследования] (https://en.wikipedia.org/wiki/Multiple_inheritance). Сожалею. – Bergi

+0

Благодарим вас за освобождение! но как создавать сложные приложения и избегать того, как избежать дублирования кода? просто переназначая свойства прототипа, такие как 'DogCat.prototype.meow = cat.prototype.meow;'? –

+0

Да, существует гораздо больше шаблонов, чтобы избежать дублирования кода, чем просто наследование. Какой из них подходит для вашей ситуации лучше всего зависит; если вы покажете свой реальный код, мы можем что-то предложить. – Bergi

ответ

2

Вы в основном на правильном пути, но есть какая-то ошибка.

Ваш первый код не будет работать, потому что вы назначаете прототип внутри конструктора, то есть прототип назначается после создания объекта. У первого созданного объекта не было бы методов прототипов, а второго. Также вы уже заметили, что назначение constructor не принесет пользы. Вы должны применять конструкторы вручную.

var DogCat = function() { 
    cat.apply(this); 
    dog.apply(this); 
    console.log("my name is " + this.dog_instance + " " + this.cat_instance); 
    } 
DogCat.prototype = dog.prototype; 

Прототипы также являются нормальными объектами. Никаких магических свойств. Вы не можете назначить два прототипа и ожидать, что он будет работать магически. Если вы хотите наследовать от двух базовых классов, вы можете написать функцию inherit для вашего удобства.

function copyPrototypeMethods(myClass,base){ 
    for(var prop in base.prototype){ 
     myClass.prototype[prop] = base.prototype[prop]; 
    } 
} 

// Use it like: 
copyPrototypeMethods(DogCat, dog); 
copyPrototypeMethods(DogCat, cat); 

Или вручную назначьте все методы, которые вам нужны, из базовых классов, если вы знаете, что вы наследуете.

DogCat.prototype.bark = dog.prototype.bark; 
DogCat.prototype.meow = cat.prototype.meow; 
+2

Вы не должны называть эту функцию 'inheritFrom'. Вместо этого, 'copyPrototypeMethods' будет уместным. Термин «наследование» подразумевает, что (с 'd = new DogCat')' d instanceof Dog' и 'd instanceof Cat' будут работать, а это не так. – Bergi

Смежные вопросы