类型判断
Object.prototype.toString.call('foo'); // "[object String]"
Object.prototype.toString.call([1, 2]); // "[object Array]"
Object.prototype.toString.call(3); // "[object Number]"
Object.prototype.toString.call(true); // "[object Boolean]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call(null); // "[object Null]"
// ... and more
let obj = {}
Object.defineProperty(obj, Symbol.toStringTag, { value: 'Module'});
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继承
- 寄生组成继承
function Parent (name) {
this.name = name;
this.colors = ['red', 'blue', 'green'];
}
Parent.prototype.getName = function () {
console.log(this.name)
}
function Child (name, age) {
// call寄生
Parent.call(this, name);
this.age = age;
}
// 原型
Child.prototype = Object.create(new Parent());
Child.prototype.construct = Child
var child1 = new Child('kevin', '18');
console.log(child1)