Передача параметров прототипной функции в JavaScript - PullRequest
5 голосов
/ 29 ноября 2009

Я недавно экспериментировал с прототипированием в javascript и не могу понять, почему следующий код не работает. Я хотел бы создать новый экземпляр сыра с параметром n.

function food(n) {
    this.n=n;
}
function cheese(n) {
    alert(this.n);
}
cheese.prototype=new food;
new cheese('paramesian');

Ответы [ 3 ]

9 голосов
/ 29 ноября 2009

Вы создаете новый экземпляр 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. Используйте другую технику, например power constructors :

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'
0 голосов
/ 30 ноября 2009

Похоже, вы просто хотите понять, как работает цепочка прототипов в JavaScript. Следующее - превосходный, простой и хорошо объясненный учебник http://www.herongyang.com/JavaScript/Inheritance-from-Constructor-Prototype-Object.html

0 голосов
/ 29 ноября 2009

Редактировать , Это явно не прототипное наследование (см. Комментарии), но, похоже, оно работает для этой конкретной цели.

function food(n) {
    this.n=n;
}
function cheese(n) {
    this.prototype = food;
    this.prototype(n);

    alert(this.n);
}

new cheese('paramesian');
...