Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.09.2013, 00:51
Аватар для Arramis
Кандидат Javascript-наук
Отправить личное сообщение для Arramis Посмотреть профиль Найти все сообщения от Arramis
 
Регистрация: 22.07.2013
Сообщений: 104

наследование ...
Приветствую всех.
Мучает вопрос по наследованию на прототипах.
Допустим есть такой код
function Parent() {
	this.parentProperty = "value",
	this.parentMethod = function() {
		alert(this.parentProperty);
	}
}

function Child() {}

var parentObject = new Parent();

Child.prototype = parentObject;

var childObject = new Child(); 

childObject.parentMethod(); // value
здесь все работает и алертиться свойство родительского объекта
и есть такой код ...
var parentObject = {
	parentProperty: "value",
	parentMethod: function() {
		alert(this.parentProperty);
	}
};

var childObject = {};

childObject.prototype = parentObject; 
childObject.parentMethod();  // Uncaught TypeError: Object #<Object> has no method 'parentMethod'

но почему childObject не имеет метода parentMethod() ???
ведь если рассуждать по логике, то создание объекта с синтаксисом var obj = {}; подразумевает под собой неявное создание объекта встроенным конструктором Object() (тоесть так: var obj = new Object()) - в таком случае этот prototype должен работать точно так же как и в первом случае, когда мы явно создаем объект с помощью конструкора. Но выдается ошибка, почему ???

Последний раз редактировалось Arramis, 09.09.2013 в 13:53.
Ответить с цитированием
  #2 (permalink)  
Старый 09.09.2013, 01:32
Профессор
Отправить личное сообщение для BallsShaped Посмотреть профиль Найти все сообщения от BallsShaped
 
Регистрация: 14.09.2012
Сообщений: 162

Сообщение от Arramis
ведь если рассуждать по логике
А не надо рассуждать по логике. Лучше прочитать материал по данному вопросу и разобраться. Например, можно почитать тут.
Ответить с цитированием
  #3 (permalink)  
Старый 09.09.2013, 10:30
Аватар для Arramis
Кандидат Javascript-наук
Отправить личное сообщение для Arramis Посмотреть профиль Найти все сообщения от Arramis
 
Регистрация: 22.07.2013
Сообщений: 104

BallsShaped,
как еще рассуждать если не по логике ? у меня вопрос возник как раз после прочтения этого раздела - вы мне предлагаете заново все перечитать потратив еще пару дней чтобы понять ? ... вроде проблему объяснил нормально, да и тема довольно интересна - форум для чего тогда
Ответить с цитированием
  #4 (permalink)  
Старый 09.09.2013, 11:36
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Arramis
таком случае этот prototype должен работать точно так же как и в первом случае, когда мы явно создаем объект с помощью конструкора.
В таком случае твой код должен быть таким:

var parentObject = {
    parentProperty: "value",
    parentMethod: function() {
        alert(this.parentProperty);
    }
};

// аналогично Child.prototype
Object.prototype = parentObject;
// Аналогично var childObject = new Child();
var childObject = {};
childObject.parentMethod();


Но он не будет работать, так как прототипы встроенных объектов можно расширять, но нельзя заменять (это моя догадка, подкрепленная поведением js-движка V8)
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 09.09.2013, 13:11
Аватар для Arramis
Кандидат Javascript-наук
Отправить личное сообщение для Arramis Посмотреть профиль Найти все сообщения от Arramis
 
Регистрация: 22.07.2013
Сообщений: 104

Сообщение от danik.js Посмотреть сообщение
прототипы встроенных объектов можно расширять, но нельзя заменять (это моя догадка, подкрепленная поведением js-движка V8)
да, тут только так и надо делать, а заменять прототипы встроенных объектов - бредятина (пропадает смысл использования встроенных средств языка):
написал функцию взяв за основу именно расширение.
function getParent(childObj, parentObj) {
	Object.prototype.extending = parentObj;
	childObj = childObj.extending;
	return childObj;
}

var parentObject = {
	parentProperty: "value",
	parentMethod: function() {
		alert(this.parentProperty);
	}
};

var childObject = {};

childObject = getParent(childObject, parentObject);

childObject.parentMethod(); // value}
Ответить с цитированием
  #6 (permalink)  
Старый 09.09.2013, 13:38
Профессор
Отправить личное сообщение для BallsShaped Посмотреть профиль Найти все сообщения от BallsShaped
 
Регистрация: 14.09.2012
Сообщений: 162

Сообщение от Arramis
у меня вопрос возник как раз после прочтения этого раздела - вы мне предлагаете заново все перечитать потратив еще пару дней чтобы понять ?
Да! Именно это я и предлагаю! Лучше потратить пару дней на прочтение и понимание того, как все работает, чем пытаться пару дней понять что-то методом тыка.
Ответить с цитированием
  #7 (permalink)  
Старый 09.09.2013, 13:44
Профессор
Отправить личное сообщение для BallsShaped Посмотреть профиль Найти все сообщения от BallsShaped
 
Регистрация: 14.09.2012
Сообщений: 162

И, кстати, очень полезный совет: забудь про alert, используй console.log и браузер chrome. Там все очень наглядно и, пожалуй, можно даже методом тыка много полезного узнать.
Ответить с цитированием
  #8 (permalink)  
Старый 09.09.2013, 13:48
Аватар для Arramis
Кандидат Javascript-наук
Отправить личное сообщение для Arramis Посмотреть профиль Найти все сообщения от Arramis
 
Регистрация: 22.07.2013
Сообщений: 104

Сообщение от BallsShaped Посмотреть сообщение
Да! Именно это я и предлагаю! Лучше потратить пару дней на прочтение и понимание того, как все работает, чем пытаться пару дней понять что-то методом тыка.
открою вам большую тайну - такие вопросы эффективнее всего решаются обсуждением и размусоливанием нескольких человек а не бесконечным пыхтением одного.
Ответить с цитированием
  #9 (permalink)  
Старый 09.09.2013, 13:57
Аватар для Arramis
Кандидат Javascript-наук
Отправить личное сообщение для Arramis Посмотреть профиль Найти все сообщения от Arramis
 
Регистрация: 22.07.2013
Сообщений: 104

Сообщение от Дзен-трансгуманист Посмотреть сообщение
Причем обсуждает один, остальные - мусолятся.
обсуждают все и мусолят те кто этого хочет
Ответить с цитированием
  #10 (permalink)  
Старый 09.09.2013, 14:04
Аватар для Arramis
Кандидат Javascript-наук
Отправить личное сообщение для Arramis Посмотреть профиль Найти все сообщения от Arramis
 
Регистрация: 22.07.2013
Сообщений: 104

Дзен-трансгуманист,
ксати Object.create() помог, за что спасибо
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопросы про наследование xfreewindx Общие вопросы Javascript 1 03.04.2013 12:39
Прототипное наследование не распространяется на вложенные свойства? novikov Общие вопросы Javascript 4 19.11.2012 14:31
Наследование от встроенного Error khusamov Общие вопросы Javascript 8 01.02.2012 13:32
наследование в javascript mat5978 Общие вопросы Javascript 18 23.11.2011 16:17
Наследование Fliand Events/DOM/Window 0 12.08.2009 20:48