以下内容是引用或者借鉴别人的,自己只是做个笔记,方便学习。理解错误的地方,欢迎评论。如有侵权,私聊我删除,未经允许,不准作为商业用途
在class
中,写法如下
class Foo {
a = 1 // 实例属性
static b = 2 // 静态属性
#c = 3 // 私有属性
baz() { // 实例方法
}
static bar() { // 静态方法
}
#bac() { // 私有方法
}
}
// 等同
function Foo(){
this.a = 1;
var c = 3;
function bac(){
}
}
Foo.b = 2;
Foo.bar = function(){}
Foo.prototype.baz = function(){}
图解
image.png
实例方法的调用规则:
- 实例化的对象,可以直接调用实例方法和属性
- 在方法内部用
this
调用实例方法和属性,用类Foo
调用静态方法和属性(注意不能使用this
)
class Foo {
a = 1 // 实例属性
static b = 2 // 静态属性
#c = 3 // 私有属性
baz() { // 实例方法
console.log(this.a)
console.log(Foo.b)
this.baz2()
Foo.bar()
}
baz2() {
console.log('world')
}
static bar() { // 静态方法
}
#bac() { // 私有方法
}
}
var f = new Foo();
f.a; // 1
f.baz2() //world
静态方法的调用规则
- 无需实例化对象,实例化的对象不能调用对象的静态方法和属性
- 在方法内部用类
Foo
调用静态方法和属性,静态方法中this
指类Foo
- 不能调用实例方法和属性,不能调用私有方法和属性
class Foo {
a = 1 // 实例属性
static b = 2 // 静态属性
#c = 3 // 私有属性
baz() { // 实例方法
}
static bar() { // 静态方法
console.log(Foo.b) //2
Foo.bar2() //world
console.log(this.a) // 错误,this指Foo
console.log(this.#c) // 错误
this.baz() // 错误
this.#bac() // 错误
}
static bar2() {
console.log('world')
}
#bac() { // 私有方法
}
}
var f = new Foo();
Foo.b; // 2
Foo.bar2(); //world
f.b //错误
f.bar2() //错误
私有方法的调用规则
- 无需实例化对象,实例化的对象不能调用对象的私有方法和属性,不能在类的外部被调用
- 在方法内部用类
Foo
调用私有方法和属性,使用this
时需要特别注意此时的this
指向什么 - 不能调用实例方法和属性,只有当
this
指向创建的实例时(将实例作为参数传入Foo.#bac(new Foo())
),才能调用
class Foo {
a = 1 // 实例属性
static b = 2 // 静态属性
#c = 3 // 私有属性
baz() { // 实例方法
}
static bar() { // 静态方法
}
#bac() { // 私有方法
console.log(Foo.#c) ; //3
Foo.#bac2(); //world
console.log(this.a) // 错误,this指Foo
console.log(Foo.b) // 2
console.log(this.b) // 2,此时this指Foo
this.baz() // 错误
Foo.bar()
}
#bac2() { // 私有方法
console.log('world')
}
}
var f = new Foo();
Foo.#c(); // 错误
Foo.#bac() // 错误
f.#c;// 错误
f.#bac();// 错误
除此之外,还有一种特殊的特权方法在类class
上未进行实现,特权方法的调用规则:
- 通过this调用实例方法和属性
- 通过类
Foo
本身调用静态方法和属性 - 在方法体内直接调用私有属性和私有方法
function Foo(){
this.a = 1;
var c = 3;
function bac() {
console.log('3')
}
this.bad = function(){ // 特权方法
console.log(this.a); //1
console.log(Foo.b); //2
console.log(c); //3
this.baz(); //1
Foo.bar(); //2
bac(); //3
}
}
Foo.b = 2;
Foo.bar = function(){
console.log('2')
}
Foo.prototype.baz = function(){
console.log('1')
}
var f = new Foo();
f.bad ()
网友评论