为什么console.log显示名称“Alex”?为什么不与“大卫”这个名字连接?
var Obj = function() {
this.name = "Alex";
var that = {};
that.name = "David";
var name = this.name + " && " + that.name;
return name;
}
var o = new Obj();
console.log(o.name);
答案 0 :(得分:2)
使用Obj
运算符调用new
作为构造函数时,始终返回一个对象。如果定义的返回值不是Object
类型,则忽略它。在Obj
内,this
引用要生成的对象,即分配给this
的每个属性都将成为每个生成对象的属性。
当您将Obj
作为普通函数调用时,它只返回定义的返回值,并忽略this
。
name
和that
只是Obj
作为范围的局部变量。它们未分配给this
,因此不属于返回的对象。由于返回值name
的类型为String
,因此它被简单地忽略(如果作为构造函数调用),而是返回一个对象,该对象包含分配给this
的所有属性(所以{{ 1}}):
.name = "Alex"
答案 1 :(得分:1)
使用如下:
var Obj = function() {
this.name = "Alex";
var that = {};
that.name = "David";
this.objName = this.name + " && " + that.name;
//return name;
}
var o = new Obj();
console(o.objName);
或者,如果您想覆盖name
var Obj = function() {
this.name = "Alex";
var that = {};
that.name = "David";
this.name = this.name + " && " + that.name;
//return name;
}
var o = new Obj();
console(o.name);
答案 2 :(得分:0)
当你调用o.name时,它将返回对象的this.name而不是声明的变量(“name”)。您需要再次更新this.name值
试试这个:
var Obj = function() {
this.name = "Alex";
var that = {};
that.name = "David";
this.name = this.name + " && " + that.name;
}
var o = new Obj();
console.log(o.name);
答案 3 :(得分:0)
新关键字存在问题。
一个解决方案是删除var关键字,然后用this.name替换每个名称。
或者更简单地摆脱新关键字。因为它会强制你的Object返回它。
如果您正在使用新关键字,则会发生以下情况:
var Foo = fuction(){
var obj = Object.create(Foo.prototype);
//your Foo code
return obj;
}
答案 4 :(得分:0)
var Obj = function() {
this.name = "Alex";
var that = {};
that.name = "David";
this.name = this.name + " && " + that.name;
return name;
}
var o = new Obj();
console.log(o.name);