类的由来
ES6 的class 可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class 写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。
- JavaScript 语言中,生成实例对象的传统方法是通过构造函数。
function Point(x,y){
this.x = x;
this.y = y;
}
Point.prototype.toString = function () {
return '(' + this.x + ', ' + this.y + ')';
};
var p = new Point(1, 2);
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return '(' + this.x + ', ' + this.y + ')';
}
}
class Point {
}
typeof Point
Point === Point.prototype.constructor
- 使用方法:直接对类使用new命令,跟构造函数的用法完全一致
class Bar {
doStuff() {
console.log('stuff');
}
}
const b = new Bar();
b.doStuff()
- ES6类上依旧有构造函数的
prototype 属性,类的所有方法都定义在类的prototype 属性上面
class Point {
constructor() {
}
toString() {
}
toValue() {
}
}
Point.prototype = {
constructor() {},
toString() {},
toValue() {},
};
class B {}
const b = new B();
b.constructor === B.prototype.constructor
let methodName = 'getArea';
class Square {
constructor(length) {
}
[methodName]() {
}
}
class Square {
constructor(length) {
}
getArea() {
}
}
const MyClass = class Me{
getClassName() {
return Me.name;
}
}
let inst = new MyClass();
inst.getClassName()
Me.name
const MyClass = class { };
let person = new class {
constructor(name) {
this.name = name;
}
sayName() {
console.log(this.name);
}
}('张三');
person.sayName();
constructor 方法
constructor() 方法是类的默认方法,通过new 命令生成对象实例时,自动调用该方法。
- 一个类必须有
constructor() 方法 - 即使你不写,JavaScript 引擎也会给你默认添加一个空的
constructor() 方法
class Point {
}
class Point {
constructor(){
}
}
constructor 方法默认返回实例对象(即this )- 也可以指定他返回的实例对象
class Point {
constructor(){}
}
new Point() instanceof Point
class Foo {
constructor(){
return Object.create(null)
}
}
new Foo() instanceof Foo
- 类必须使用
new 调用,否则会报错 - 而普通构造函数不用
new 也能执行
class Foo {
constructor(){}
}
new Foo()
Foo()
类的实例
class Foo {
constructor(){}
}
let foo = new Foo(6,4);
let foo = Foo(6,4)
- 实例的属性定义有两种情况:
- 第一种:定义在自身的
this 对象上 - 第二种:定义在原型上,即
class 上
class Foo {
constructor(){
this.x = x,
this.y = y
}
toString(){
return '(' + this.x + ', ' + this.y + ')';
}
}
let foo = new Foo(6,4)
foo.toString(6,4)
foo.hasOwnProerty("x")
foo.hasOwnProperty('y')
foo.hasOwnProperty('toString')
foo.__proto__.hasOwnProperty('toString')
let foo = new Foo(3,4)
let fvv = new Foo(5,2)
foo.__proto__ ==== fvv.__proto__
取值函数和存值函数(getter、setter)
- 在类的内部可以使用
get 和set 关键字 - 对某个属性设置存值函数和取值函数,拦截该属性的存取行为
class MyClass {
constructor(){}
get prop(){
return "getter"
}
set prop(value){
console.log('setter: '+value);
}
}
let inst = new MyClass();
inst.prop = 124
inst.prop
静态方法和静态属性(static)
静态方法:
在类中定义的方法,前面加上 static 关键字,表示静态方法
- 类相当于实例的原型,所有在类中定义的方法,都会被实例所继承
- 而用
static 声明的方法不会被实例继承,而是直接通过类来掉用,称之为静态方法
class MyClass {
static myFunction (){
return "hello world"
}
}
MyClass.myFunciton()
let me = new MyClass()
me.myFunction()
- 静态方法
this 指向类,而非静态方法方法this 指向类中的实例对象 - 静态方法可以与非静态方法重名
class MyClass {
static fn(){
this.fun()
}
static fun(){
return "hello"
}
fun(){
return "world"
}
}
MyClass.fun()
class Foo {
static classMethod() {
return 'hello';
}
}
class Bar extends Foo {
}
Bar.classMethod()
class Foo {
static classMethod() {
return 'hello';
}
}
class Bar extends Foo {
static classMethod() {
return super.classMethod() + ', too';
}
}
Bar.classMethod()
静态属性:
静态属性指的是 Class 本身的属性,即Class.propName ,而不是定义在实例对象(this )上的属性。
class Foo {
}
Foo.prop = 1;
class Foo {
static prop = 1;
}
|