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)

  但是ES6提供了一种更简单的写法,我们可以把他看做一个语法糖,他的绝大部分功能,ES5都能实现,新的class写法只是让对象原型的写法更清晰,更像面向对面编程的语法而已,上面的代码可以修改成

	class Point{
		constructor(x,y){
			this.x = x;
			this.y = y
		}

		toString() {
			return '('+this.x+','+this.y+')';
		}
	}

  上面的代码定义了一个“类”,可以看到里面有一个constructor方法,这就是构造方法,而this关键字代表实例对象,也就是说,ES5的构造函数Point,对应的ES6Point类的构造方法。

Point类除了构造方法,还定义了一个toString方法,注意,定义“类”的方法的时候,前面不需要再加上function关键字了,直接把函数定义放进去就行了。另外,方法之间不需要逗号分隔,加了会报错!

ES6的类,完全可以看成构造函数的另一种写法

 

class Point {
           //....        
}

typeof Point //function
Point === Point.prototype.constructor  //true

  上面的代码可以看出来,类的数据类型就是函数,类的本省指向构造函数。

使用的时候,直接对类使用new命令,跟构造函数的用法完全一样

class Bar {
  doStuff() {
    console.log('stuff');
  }
}

var b = new Bar();
b.doStuff() // "stuff"

  构造函数的prototype属性,在ES6中的‘类’依旧存在,事实上,类的所有方法都定义在类的prototype上面

    class Point{
        constructor(){
            //...
        }

        toString(){
            //...
        }

        toValue(){
            //...
        }
    }

    Point.prototype = {
        constructor(){},
        toString(){},
        toValue(){}
    }

 

在类的实例上面调用方法,其实就是调用原型上的方法!

	class B {}
	let b = new B();
	b.constructor ===B.prototype.constructor	//true

  可以看出,b是B的实例,它的constructor方法就是B类原型的constructor方法

  由于类的方法都定义在prototype对象上面,所以类的新方法可以添加在prototype对象上面,Object.assign方法可以很方便的向类添加多个方法

class Point {
  constructor(){
    // ...
  }
}

Object.assign(Point.prototype, {
  toString(){},
  toValue(){}
});

  所有类的内部定义的方法,都是不可枚举的  

 

转载于:https://www.cnblogs.com/zhengsongjun/p/7659524.html

你可能感兴趣的:(javascript)