Передача параметров в функцию-прототип в javascript

StackOverflow https://stackoverflow.com/questions/1814201

  •  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');
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top