为什么输出未定义
Why output undefined?
问题
在这里,我创建了
- 使用构造函数的
Owner
对象 - 使用构造函数的
Camera
对象
在第二个输出语句中,我希望它显示为第一个语句,但它显示为未定义语句。
这可能是因为我在this.owner
、this.make
等中编写summary()
方法的方式。
注意:-第一个输出语句从构造函数外部访问变量值。但是在第二个输出语句中,summary()
方法访问构造函数本身内部的变量。
make变量(而不是参数(不应该以这种方式使用吗?如何在对象构造器中使用它们?
请帮我理解这个概念。也请提供一些参考,我可以掌握这个概念。
运行测试:CodeAcademy Workspace的代码段
代码段
//camera object contructor
function Camera(model, make, year, owner)
{
this.make = make.toString();
this.model = model.toString();
this.year = parseInt(year);
this.owner = function(){
return (owner.fname + " " + owner.lname).toString();
}();
this.summary = function(){
return this.owner + " bought a " + this.make + " " + this.model + ", released in " + this.year + ".";
}();
}
//owner object contructor
function Owner(fname, lname){
this.fname = fname;
this.lname = lname;
}
//create owner
var niky = new Owner("Niky", "Bauxi");
//create camera for owner
var niky_cam = new Camera("DSLR D3100", "Nikon", 2009, niky);
console.log(niky_cam.owner + " bought a " + niky_cam.make + " " + niky_cam.model + ", released in " + niky_cam.year + ".");
console.log(niky_cam.summary);
输出
Niky Bauxi bought a Nikon DSLR D3100, released in 2009.
undefined bought a undefined undefined, released in undefined.
解决方案
在考虑了不同的答案之后&评论,
解决方案1:CodeAcademy工作区
您在用于进行摘要的IIF中调用this.owner
、this.make
等。但在IIF内部,this
是指窗口对象;而不是您正在构建的Owner对象。例如,您试图在字符串中使用window.owner
、window.make
等,但它们不存在。
试试这个
function Camera(model, make, year, owner) {
this.make = make.toString();
this.model = model.toString();
this.year = parseInt(year, 10); // ALWAYS supply a radix argument!
this.owner = (function(){
return (owner.fname + " " + owner.lname).toString();
}());
var that = this;
this.summary = (function(){
return that.owner + " bought a " + that.make + " " + that.model + ", released in " + that.year + ".";
}());
}
但IIF从一开始就毫无意义。你也可以这样做:
function Camera(model, make, year, owner) {
this.make = make.toString();
this.model = model.toString();
this.year = parseInt(year, 10);
this.owner = owner.fname + " " + owner.lname;
this.summary = this.owner + " bought a " + this.make + " " + this.model + ", released in " + this.year + ".";
}
此外,还有更好的方法来构建这一切(参见Benjamin Gruenbaum的评论(,但这回答了你的直接问题。
附录:您可以使用call
或apply
以不同的方式执行IIF,从而传递应该在中评估的上下文
function Camera(model, make, year, owner) {
// ...
this.summary = (function(){
return this.owner + " bought a " + this.make + " " + this.model + ", released in " + this.year + ".";
}).call(this); // explicitly pass the current context to the function
}
但是,在你的情况下,所有这些都是不必要的。
相关文章:
- Node.js/Express未输出console.log,highcharts.js给出未定义的错误
- JS函数只返回未定义的数据,但alert输出正确的数据
- '未定义'当需要模块时输出
- 具有中文字符但输出的JSON.parse数据变为“;未定义”;
- 为什么我的输出未定义
- IE9中的有效输出,但IE7/IE8中的未定义输出
- 当在 Javascript 中使用许多 for 循环时,输出是未定义的
- 它无法正常工作,它输出未定义
- 使用 PHP 输出的 Javascript 数组时出现未定义错误
- 为什么简码输出中的值“未定义” - tinyMCE
- Vue.js 使用 Vuex 和自定义组件,@click方法输出未定义
- 为什么 javascript 对象在循环遍历数组时输出为“未定义”
- 为什么我得到未定义的输出Javascript
- 对象未定义/HTML使用jQuery输出
- 未定义获取输出而不是对象属性
- 为什么当我将变量记录到控制台时,我得到了输出,但是当我返回它时,我收到“未定义”
- 函数对数组元素进行编号输出“;未定义”;
- 带有Ajax的JavaScript和HTTP请求输出未定义的显示2
- Handlebars追加'未定义'在助手输出上
- 对象实例为其输出“未定义”'s原型'的属性.为什么?