在javascript中将参数传递给原型函数
我最近一直在用javascript进行原型设计实验,我不明白为什么下面的代码不起作用。我想做的是用参数n创建一个新的cheese实例在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)
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'