Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中将参数传递给原型函数_Javascript_Function Prototypes - Fatal编程技术网

在javascript中将参数传递给原型函数

在javascript中将参数传递给原型函数,javascript,function-prototypes,Javascript,Function Prototypes,我最近一直在用javascript进行原型设计实验,我不明白为什么下面的代码不起作用。我想做的是用参数n创建一个新的cheese实例 function food(n) { this.n=n; } function cheese(n) { alert(this.n); } cheese.prototype=new food; new cheese('paramesian'); 编辑,这显然不是典型的继承(请参见注释),但它似乎确实适用于此特定目的 function food(n)

我最近一直在用javascript进行原型设计实验,我不明白为什么下面的代码不起作用。我想做的是用参数n创建一个新的cheese实例

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

编辑,这显然不是典型的继承(请参见注释),但它似乎确实适用于此特定目的

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

    alert(this.n);
}

new cheese('paramesian');

您正在创建一个新的
Cheese
实例,参数
n
从未被使用或分配给
Cheese
实例变量
this.n
,因为该逻辑仅在
Food
构造函数上使用

你可以做几件事:

一,。使用
参数
对象和新创建的上下文(
this
),在
Cheese
函数中使用
食物
构造函数

二,。在
Cheese
构造函数上重复
Food
构造函数逻辑(
this.n=n
):

function Food(n) {
    this.n=n;
}

function Cheese(n) {
    this.n = n;
    alert(this.n);
}

Cheese.prototype = new Food();
new Cheese('paramesian');
三,。使用另一种技术,如:

四,。另一个选择是:


似乎您只是想了解原型链接在JavaScript中是如何工作的。下面是一个优秀的、简单的、解释良好的教程

我喜欢#3,但你必须删除“食物(n)”前面的“新”。谢谢你提供了信息丰富的答案。选项1似乎是目前最好的选择,至少在完全理解3之前是这样。我对你投了反对票,因为在JavaScript中原型继承不是这样工作的。你也可以这么说,任何东西=食物;这是。任何(n),您仍然会得到正确的警报。但是
cheese
决不是用那个代码进入原型链的。我没有否决你,但是
prototype
对象是用来在构造函数上而不是对象实例上使用的(比如
this
is),你的例子是有效的,因为当你调用
this.prototype(n)
,您正在新的“cheese”对象(
)的上下文中执行
食物
,就像我发布的第一个示例一样,尝试更改示例中的
prototype
关键字以获得
foobar
,您将看到它也可以工作,它与原型链无关……啊,好的,我明白了。谢谢,那很有帮助。似乎我误解了那里的基本概念。在这个原型的东西上仍然有点模糊。到目前为止还没有真正需要它。
function Food(n) {
    this.n=n;
}

function Cheese(n) {
    this.n = n;
    alert(this.n);
}

Cheese.prototype = new Food();
new Cheese('paramesian');
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');
// 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'