наследование ...
Приветствую всех.
Мучает вопрос по наследованию на прототипах. Допустим есть такой код
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,
как еще рассуждать если не по логике ? у меня вопрос возник как раз после прочтения этого раздела - вы мне предлагаете заново все перечитать потратив еще пару дней чтобы понять ? ... вроде проблему объяснил нормально, да и тема довольно интересна - форум для чего тогда |
Цитата:
var parentObject = {
parentProperty: "value",
parentMethod: function() {
alert(this.parentProperty);
}
};
// аналогично Child.prototype
Object.prototype = parentObject;
// Аналогично var childObject = new Child();
var childObject = {};
childObject.parentMethod();
Но он не будет работать, так как прототипы встроенных объектов можно расширять, но нельзя заменять (это моя догадка, подкрепленная поведением 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}
|
Цитата:
|
И, кстати, очень полезный совет: забудь про alert, используй console.log и браузер chrome. Там все очень наглядно и, пожалуй, можно даже методом тыка много полезного узнать.
|
Цитата:
|
Цитата:
|
Дзен-трансгуманист,
ксати Object.create() помог, за что спасибо |
| Часовой пояс GMT +3, время: 16:46. |