令人困惑的JavaScript语句:“var x = new this();”

时间:2010-08-13 03:00:24

标签: javascript class inheritance

我认为我理解了JavaScript原型对象的概念,以及[[proto]],直到我看到一些关于类继承的帖子。

首先,http://amix.dk/blog/viewEntry/19038

上的“JavaScript OOP - 智能方式”

参见实施部分:

var parent = new this('no_init');

还有John Resig的伟大博客上的“简单JavaScript继承”。

var prototype = new this();

new this();实际上意味着什么?

这句话对我没有意义,因为我的理解是this指向一个对象而不是一个构造函数。我也尝试在Firebug中测试语句来解决这个问题,我收到的只是语法错误。

我的头已经完全旋转了。

有人可以详细解释一下吗?

8 个答案:

答案 0 :(得分:5)

AJS.Class有效地*翻译了这个:

var Person = new AJS.Class({
    init: function(name) {
        this.name = name;
        Person.count++;
    },
    getName: function() {
        return this.name;
    }
});
Person.count = 0;

进入这个:

var Person = function (name) {
    this.name = name;
    Person.count++;
};

Person.prototype = {
    getName: function() {
        return this.name;
    }
};

Person.extend = AJS.Class.prototype.extend;
Person.implement = AJS.Class.prototype.implement;

Person.count = 0;

因此,在这种情况下,this中的AJS.Class.prototype.extend引用Person,因为:

Person.extend(...);
// is the same as
Person.extend.call(Person, ...);
// is the same as
AJS.Class.prototype.extend.call(Person, ...);

*有很多案例我不会过去;这个重写是为了简化理解问题。

答案 1 :(得分:5)

令我感到困惑的是,我认为,这正是“这个”真正来自的地方。所以忍受我 - 这是一个非常简短的解释,我希望能够说清楚。

在JavaScript中,函数内部“this”的含义总是在调用函数时确定。当你这样做时:

jimmy.nap();

小睡功能(方法)运行并接收吉米作为“这个”。

哪些对象提到午睡是无关紧要的。例如:

var jimmy = {}, billy = {};
jimmy.nap = function(){ alert("zzz"); };
var jimmy_nap = jimmy.nap;
jimmy_nap(); // during this function's execution, this is *NOT* jimmy!
             // it is the global object ("window" in browsers), which is given as the 
             // context ("this") to all functions which are not given another context.
billy.sleep = jimmy.nap;
billy.sleep(); // during this function's excution, this is billy, *NOT* jimmy
jimmy.nap(); //okay, this time,  this is jimmy!

换句话说,只要你有:

var some_func = function(arg1, arg2){ /*....*/ };
// let's say obj and other_obj are some objects that came from somewhere or another
obj.some_meth = some_func;
other_obj.some_meth = some_func;
obj.some_meth(2, 3);
other_obj.some_meth(2, 3);

它被“翻译”成了什么(不是字面意思 - 这是教学法,而不是关于javascript解释器实际上是如何工作的)是这样的:

var some_func = function(this, arg1, arg2){ /* ...*/ };
// let's say obj and other_obj are some objects that came from somewhere or another
obj.some_meth = some_func;
other_obj.some_meth = some_func;
obj.some_meth(obj, 2, 3);
other_obj.some_meth(other_obj, 2, 3);

因此,请注意该页面上示例中如何使用extend:

UniversityPerson = Person.extend({ /* ... */ });

流行测验:当延伸运行时,它认为“这个”是指什么? 答:没错。 “人”。

所以上面令人费解的代码与(在特定情况下)相同:

var prototype = new Person('no_init');

不再那么神秘了,是吗?这是可能的,因为与某些语言不同, 一个JavaScript变量 - 包括“this” - 可以包含任何值,包括Person等函数。

(没有任何东西可以使Person特别是构造函数。任何函数都可以使用new关键字调用。如果我记得确切的语义,我认为它们是当使用new关键字调用函数时,会自动给出一个空对象({})作为它的上下文(“this”),当函数返回时,返回值是同一个对象,除非(可能是?)该函数返回其他内容)

这是一个很酷的问题,因为它说明了JavaScript的整洁或奇怪的一个非常重要的部分(取决于你如何看待它)。

这会回答你的问题吗?如有必要,我可以澄清一下。

答案 2 :(得分:3)

想象一下以下情况:

var inner = function () {
    var obj = new this;
    console.log(obj.myProperty);
};

var f1 = function () {
    this.myProperty = "my Property"
}

f1.f2 = inner;
f1.f2();

这里调用对象本身就是一个函数,所以这个将返回一个函数,我们可以instantiate it

为了使用 this()(不是 this ),外部函数(上下文)必须自己返回可以实例化的smth(另一个函数):

var inner = function () {
    var obj = new this();
    console.log(obj.myProperty);
};

var f1 = function () {
    var func = function () {};
    func.myProperty = 'my property';
    return func;
};

f1.f2 = inner;
f1.f2();

答案 3 :(得分:3)

在javascript static函数中,您可以像这样调用new this()

var Class = function(){}; // constructor
Class.foo = function(){return this;} // will return the Class function which is also an object

因此,

Class.foo = function(){ return new this();} // Will invoke the global Class func as a constructor

故事的寓意是,不要忘记当你不打电话时,功能就像任何其他物体一样。

答案 4 :(得分:0)

看到这个链接http://www.quirksmode.org/js/this.html它会告诉你关于这个关键字,但我不确定这是什么(),可能是它的某种用户定义函数......你不是意识到......

答案 5 :(得分:0)

“this”表示当前正在运行的函数的上下文。

您发布的代码肯定会出现在充当对象方法的函数中。 所以对象就是函数的上下文。

“new this()”将在使用传递的参数运行其构造函数后返回当前对象的克隆。

答案 6 :(得分:-1)

this()引用代码所在的函数,但this()必须在该函数内。调用new this();在函数内会创建一个永无止境的循环。在函数外部调用它将是多余的,因为没有函数/类设置为this()。

答案 7 :(得分:-1)

更简单的代码说明:

class User {
  constructor() {
    this.name = '';
    this.age = '';
  }
  static getInfo() {
    let user = new this();
    console.log(user);
  } 
}

User.getInfo()

输出:

Object {
  age: "",
  name: ""
}