类型判断

  1. Object.prototype.toString.call('foo'); // "[object String]"
  2. Object.prototype.toString.call([1, 2]); // "[object Array]"
  3. Object.prototype.toString.call(3); // "[object Number]"
  4. Object.prototype.toString.call(true); // "[object Boolean]"
  5. Object.prototype.toString.call(undefined); // "[object Undefined]"
  6. Object.prototype.toString.call(null); // "[object Null]"
  7. // ... and more
  8. let obj = {}
  9. Object.defineProperty(obj, Symbol.toStringTag, { value: 'Module'});
  10. Object.prototype.toString.call(obj); // [object Module]

什么是面向对象

面向对象是一种编程思想,JS本身就是基于对象的一门语言。
例如,js中很多内置的类,例如es5的引用类型ES6的proxy、reflect、promise等,还有比如框架vue/react都是类,平时在开发过程中都是通过他们的类创建实例来操作的,平时也会封装一些组件插件的类,比如之前写的jq的toast插件,react 云图上传的组件,也是基于对象开发的,这样可以管理私有属性和公有方法,创建不同的实例。
不过JS的面向对象和java还有些不同,面向对象的封装和其他语言差不多,
但是JS类和实例继承是基于原型和原型链机制的,java是复制原型,
而且关于类的多态(重载和重写),也和其他语言不同,js子类重写可能会改变父类的方法。

1.类的继承、封装、多态

继承:子类继承父类上的方法
封装:低耦合高内聚
(通过函数对象实现某一个或者某一系列功能就叫封装)
多态:重载和重写
重载:方法相同,形参个数或者类型不同(JS不存在真正的重载,js中重载就是使用同一个方法,判断参数类型或者个数,实现不同功能),因为前端不需要实现复杂的业务逻辑
重写:子类可以覆盖父类的方法

继承方式:

  • 原型继承
  • call继承
  • 寄生组成继承
  1. function Parent (name) {
  2. this.name = name;
  3. this.colors = ['red', 'blue', 'green'];
  4. }
  5. Parent.prototype.getName = function () {
  6. console.log(this.name)
  7. }
  8. function Child (name, age) {
  9. // call寄生
  10. Parent.call(this, name);
  11. this.age = age;
  12. }
  13. // 原型
  14. Child.prototype = Object.create(new Parent());
  15. Child.prototype.construct = Child
  16. var child1 = new Child('kevin', '18');
  17. console.log(child1)