Передача параметров в функцию-прототип в javascript
-
06-07-2019 - |
Вопрос
Недавно я экспериментировал с прототипированием в javascript, и я не могу понять, почему следующий код не работает. Я хотел бы создать новый экземпляр сыра с параметром n.
function food(n) {
this.n=n;
}
function cheese(n) {
alert(this.n);
}
cheese.prototype=new food;
new cheese('paramesian');
Решение
Вы создаете новый экземпляр Cheese
, и аргумент n
никогда не используется и не присваивается переменной Cheese
экземпляра this .n
, поскольку эта логика используется только в конструкторе Food
.
Вы можете сделать несколько вещей:
1. Применить конструктор Food
внутри функция Cheese
, использующая объект arguments
и вновь созданный контекст ( this
).
function Food(n) {
this.n=n;
}
function Cheese(n) {
Food.apply (this, arguments);
alert(this.n);
}
new Cheese('paramesian');
2. Повторите логику конструктора Food
( this.n = n
) для функции конструктора Cheese
:
function Food(n) {
this.n=n;
}
function Cheese(n) {
this.n = n;
alert(this.n);
}
Cheese.prototype = new Food();
new Cheese('paramesian');
3. Используйте другой метод, например, конструкторы питания : р>
function food (n) {
var instance = {};
instance.n = n;
return instance;
}
function cheese (n) {
var instance = food(n);
alert(instance.n);
return instance;
}
cheese('parmesian');
cheese('gouda');
4. Еще один вариант: наследование прототипа :
// helper function
if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F () {}
F.prototype = o;
return new F();
};
}
var food = {
n: "base food",
showName : function () { alert(this.n); }
};
var cheese1 = Object.create(food);
cheese1.n = 'parmesian';
cheese1.showName(); // method exists only in 'food'
Другие советы
Похоже, вы просто хотите понять, как работает цепочка прототипов в JavaScript. Ниже приведен отличный, простой и хорошо объясненный учебник http://www.herongyang.com/JavaScript/Inheritance- из-Конструктор-прототипа-object.html р>
Изменить . Это явно не прототипное наследование (см. комментарии), но, похоже, оно работает для этой конкретной цели.
function food(n) {
this.n=n;
}
function cheese(n) {
this.prototype = food;
this.prototype(n);
alert(this.n);
}
new cheese('paramesian');