这个。没有显示正确的名称

时间:2016-04-18 08:35:17

标签: javascript closures this scopes

为什么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);

5 个答案:

答案 0 :(得分:2)

使用Obj运算符调用new作为构造函数时,始终返回一个对象。如果定义的返回值不是Object类型,则忽略它。在Obj内,this引用要生成的对象,即分配给this的每个属性都将成为每个生成对象的属性。

当您将Obj作为普通函数调用时,它只返回定义的返回值,并忽略this

namethat只是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);