我认为我理解了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中测试语句来解决这个问题,我收到的只是语法错误。
我的头已经完全旋转了。
有人可以详细解释一下吗?
答案 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: ""
}