Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   наследование ... (https://javascript.ru/forum/misc/41331-nasledovanie.html)

Arramis 09.09.2013 00:51

наследование ...
 
Приветствую всех.
Мучает вопрос по наследованию на прототипах.
Допустим есть такой код
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 должен работать точно так же как и в первом случае, когда мы явно создаем объект с помощью конструкора. Но выдается ошибка, почему ???

BallsShaped 09.09.2013 01:32

Цитата:

Сообщение от Arramis
ведь если рассуждать по логике

А не надо рассуждать по логике. Лучше прочитать материал по данному вопросу и разобраться. Например, можно почитать тут.

Arramis 09.09.2013 10:30

BallsShaped,
как еще рассуждать если не по логике ? у меня вопрос возник как раз после прочтения этого раздела - вы мне предлагаете заново все перечитать потратив еще пару дней чтобы понять ? ... вроде проблему объяснил нормально, да и тема довольно интересна - форум для чего тогда

danik.js 09.09.2013 11:36

Цитата:

Сообщение от 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)

Arramis 09.09.2013 13:11

Цитата:

Сообщение от danik.js (Сообщение 271520)
прототипы встроенных объектов можно расширять, но нельзя заменять (это моя догадка, подкрепленная поведением 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}

BallsShaped 09.09.2013 13:38

Цитата:

Сообщение от Arramis
у меня вопрос возник как раз после прочтения этого раздела - вы мне предлагаете заново все перечитать потратив еще пару дней чтобы понять ?

Да! Именно это я и предлагаю! Лучше потратить пару дней на прочтение и понимание того, как все работает, чем пытаться пару дней понять что-то методом тыка.

BallsShaped 09.09.2013 13:44

И, кстати, очень полезный совет: забудь про alert, используй console.log и браузер chrome. Там все очень наглядно и, пожалуй, можно даже методом тыка много полезного узнать.

Arramis 09.09.2013 13:48

Цитата:

Сообщение от BallsShaped (Сообщение 271550)
Да! Именно это я и предлагаю! Лучше потратить пару дней на прочтение и понимание того, как все работает, чем пытаться пару дней понять что-то методом тыка.

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

Arramis 09.09.2013 13:57

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 271556)
Причем обсуждает один, остальные - мусолятся.

обсуждают все и мусолят те кто этого хочет

Arramis 09.09.2013 14:04

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


Часовой пояс GMT +3, время: 05:44.