在到达他要去的地方之前,第一步是得到this
。
通常可以指出三件事this
。如果您有一个作为对象属性的函数:
var Bob = {
name : "Bob",
say : function () { console.log(this.name); }
};
Bob.say(); // "Bob"
在这种情况下,this
指向拥有该属性的任何对象(无论前面是一个点,在调用函数的确切时刻)
var say = Bob.say; // passing the function to a variable
var Sam = { name : "Sam" };
Sam.say = Bob.say; // passing the function to an object's property
say(); // undefined -- not what you were expecting
Sam.say(); // "Sam"
所以this
在最后可能的一秒决定。
函数也有它们自己的属性,比如对象。
其中两个是被调用的函数.call
,.apply
它们允许你运行函数,但告诉函数究竟是什么this
。
还记得自己如何say();
不工作吗?
var say = Bob.say;
say.call(Bob); // "Bob" -- hooray!
下一部分this
是我们在面向对象语言中最常用的部分;使用this
withnew
来创建一个类的新实例:
var Person = function (name) {
this.name = name;
this.say = function () { console.log(this.name); };
};
var bob = new Person("Bob");
bob.say(); // "Bob"
基本上,在这个构造函数(或任何函数,因为构造函数在 JS 中并不特殊)内部,该函数首先检查是否new
被调用。
如果是,则设置this
为一个全新的对象,无论它是否是对象的一部分:
var Creatures = {};
Creatures.Person = Person;
Creatures.Person("Bob"); // `this` === Creatures
Creatures.name; // "Bob" -- whoops
var bob = new Creatures.Person("Bob");
bob.say(); // "Bob", yay!
所以就像函数在函数if (new) { this = {}; }
顶部说的一样。
我说有三种可能。
第三个是this === window
如果你使用一个this
不是对象的函数(通过调用/应用,或作为对象的属性)并且new
不用于创建新对象,则this
指向window
.
这就是为什么say();
以前不能自己工作的原因;window.say();
是等价的。
回到new
一秒钟——new
做一些其他的事情。
即,它设置对象的构造函数的值:
var bob = new Person();
bob instanceof Person; // true
它还使由该构造函数生成的prototype
对象可以访问所有实例共享的对象。
所以现在,看看 Class/Klass 内部发生了什么:
我们正在创建一个new Class();
对象。
在Class
函数内部,this = {};
(因为new
)。
然后,我们正在制作一个新的“构造函数”函数,klass
.
然后,我们将原型init
函数设置.apply
为任何新this
的(在klass
调用新实例时)。
然后我们要归还克拉斯。
klass 实际上是您创建新课程时所调用的内容
当你调用一个类的新对象时,klass 正在运行。
希望对new
andthis
和.call
and有帮助Class/klass
。