1 回答
TA贡献1951条经验 获得超3个赞
先来看一段 ES6 class 语法的例子
class Person {
say() {
console.log("hello");
}
}
const person = new Person();
person.say();
上面这是采用 class 语法定义的 Person 类,它有一个 say() 方法。运行效果和题主的代码运行效果一致,但本质上还是有些区别。这段代码里看不到 this,而 say() 方法也不是定义在 Person 的每个实例对象上,而是定义在 Person 的原型对象中。
如果要把题主的代码翻译成 class 语法,应该是这样:
class Person {
constructor() {
this.say = function() {
console.log("hello");
};
}
}
const person = new Person();
person.say();
这里出现了 constructor,即构造函数。构造函数中,通过 this 指针对实例对象添加了一个 say() 方法。如果有多个实现,每个实例都有自己的 say() 方法实例,虽然行为一样,但却是不同的对象,可以验证一下
class Person {
constructor() {
this.say = function() {
console.log("hello");
};
}
}
const person = new Person();
const p2 = new Person();
console.log(person.say === p2.say);
// false
这里提到了构造函数。在 ES6 以前,需要定义 JavaScript 类,就是通过构造函数来定义的,然而实际上,构造函数和普通函数在定义上并没有多大区别,当调用的时候使用了 new
运算符,就是构造,没使用,就是普通函数 参阅:JavaScript 的 this 指向问题深度解析。
OOP 语言在产生对象的时候一般都是这么一个过程:产生一个对象,从最远的基类开始依次调用变量初始化(如果有的话)和构造函数,所以调用构造函数的时候,已经存在对象,this
指针已经生效,可以在构造函数中使用 this
指针。对于静态语言来说,可以通过 this
指针访问已经定义的属性,或者方法。而 JavaScript 是动态语言,所以甚至可以使用 this
指针赋予它新的属性,比如 this.say = ....
,当这个属性是一个函数表达式的时候,就相当于是在定义新的实例方法(非常确切的实例方法,每个实例一个,各自不同)。
最后,既然是方法,那就可以使用 对象.方法()
的形式来调用,也就是 person.say()
。如果没有定义,当然也就不能调用了,也就是题主说的没效果(实际应该报错)
添加回答
举报