Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.11.2014, 16:02
Интересующийся
Отправить личное сообщение для javacrypt Посмотреть профиль Найти все сообщения от javacrypt
 
Регистрация: 10.11.2014
Сообщений: 12

Вопрос о наследовании
Изучаю js, пытаюсь понять наследование.
function Product(name) {
	this.name = name;
}
	
Product.prototype = {
	getName: function() {
		return this.name;
	}
}

function Apple(name) {
	Product.call(this, name);
}
       
extend(Apple.prototype, Product.prototype);
	
function extend(child, parent) {
	for (var i in parent) { 
		child[i] = parent[i]; 
	}
}

var apple = new Apple("яблоко");
console.log(apple.getName());


Что плохого в использовании extend? То, что это копирование метода из одного прототипа в другой? То есть скопированный метод getName будет ссылаться не на Product.prototype, а на Apple.prototype? В этом проблема или в чём? Поясните, плз.

Последний раз редактировалось javacrypt, 28.11.2014 в 16:06.
Ответить с цитированием
  #2 (permalink)  
Старый 28.11.2014, 17:08
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Проблема в том, что это копирование, а не наследование. Это разные вещи. Если в Apple.prototype и Product.prototype будут одноименные методы, копирование перезапишет метод ребенка методом предка, наследование - нет. Наследование реализуется так:
function extend(Child, Parent) {
  Child.prototype = Object.create(Parent.prototype, {
    constructor: {
      value: Child,
      enumerable: false,
      writable: true,
      configurable: true
    }
  });
};

То есть, в итоге должно получиться, что (new Child()).__proto__.__proto__ == (new Parent()).__proto__
Ответить с цитированием
  #3 (permalink)  
Старый 28.11.2014, 17:34
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Твой вариант будет работать, но он кривой надо хотя бы так
function Product() {}

Product.prototype = {
    getName: function() {
        return this.name;
    }
}
 
function Apple(name) {
    this.name=name
}

Apple.prototype=Object.create(Product.prototype)
        
var apple = new Apple("apple");
alert(apple.getName());

Но лучше восстановить связи:
function Product() {}

Product.prototype.getName=function() {
        return this.name;
    }
 
function Apple(name) {
    this.name=name
}

Apple.prototype=Object.create(Product.prototype)
Apple.prototype.constructor=Apple
        
var apple = new Apple("apple");
alert(apple.getName())
alert(apple.constructor);

Тут, собчтвенно, класс product вообще не нужен. Ну ладно, пусть будет
По сабжу. В копировании плохо то, что оно засирает память, и, в некотором смысле, нарушает модульность.

Последний раз редактировалось krutoy, 28.11.2014 в 17:42.
Ответить с цитированием
  #4 (permalink)  
Старый 28.11.2014, 17:42
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

krutoy,
Опять забыл восстановить ребенку ссылку на его конструктор. Ну и вариант от Erolast ничем не кривой.

Еще в копировании плохо то что мы не сможем проверять принадлежность к классу через instaceof

Последний раз редактировалось tsigel, 28.11.2014 в 17:49.
Ответить с цитированием
  #5 (permalink)  
Старый 28.11.2014, 17:53
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от tsigel
Ну и вариант от Erolast ничем не кривой.
Я про вариант ТС'а говорил. Он тоже рабочий, в принципе. но кривоватый, да
Ответить с цитированием
  #6 (permalink)  
Старый 28.11.2014, 18:01
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

tsigel,
Кстати, вариант того клоуна тоже крив, потому что он избыточен. Вся эта параша, которую он подает вторым параметром Object.create -- не нужна. А пишет эту всю парашу поциэнт, потому что он джаваскрипт не понимает, а этот говнопаттерн где-то увидел и копирует бездумно. Из песни слов не выкинешь, боится клоун, что-то изменить, боится, что-нибудь сломается в коде.
Ответить с цитированием
  #7 (permalink)  
Старый 28.11.2014, 18:05
Интересующийся
Отправить личное сообщение для javacrypt Посмотреть профиль Найти все сообщения от javacrypt
 
Регистрация: 10.11.2014
Сообщений: 12

То есть выходит, что все экземпляры "класса" Apple будут иметь свой личный метод getName, в то время как если наследовать через прототип все экземпляры будут ссылаться на один и тот же прототип . Теперь стало понятно. Спасибо всем
Ответить с цитированием
  #8 (permalink)  
Старый 28.11.2014, 18:05
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

krutoy,
Вторым аргументом он восстанавливает ссылку на конструктор.
Ответить с цитированием
  #9 (permalink)  
Старый 28.11.2014, 18:12
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

javacrypt,
Кстати, можно и изящней написать, с сахарком
function Product() {}
Object.defineProperty(Product.prototype, "name", {get: function(){return this.name_}})
 
function Apple(name) {
    this.name_=name
}
Apple.prototype=Object.create(Product.prototype)
Apple.prototype.constructor=Apple
        
var apple = new Apple("apple");
alert(apple.name)
Ответить с цитированием
  #10 (permalink)  
Старый 28.11.2014, 18:15
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от tsigel
Вторым аргументом он восстанавливает ссылку на конструктор.
чтобы это сделать, достаточно
Apple.prototype.constructor=Apple

А он написал невнятную, нечитаемую, и непонятно зачем нужную парашу.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос по toDataURL() GodZiLA Общие вопросы Javascript 0 03.06.2014 17:21
Всплытие событий или что то не так... Кирюха =) jQuery 6 30.03.2013 12:56
Вопрос по each() и перебору строк таблицы battrack jQuery 1 09.02.2012 14:30
Теоретический вопрос. gods33 (X)HTML/CSS 10 16.12.2010 23:49
Вопрос про ООП, цепочки прототипов. Shaci Общие вопросы Javascript 5 27.01.2010 14:50