前言
上节课我们简单介绍了原型对象,这节课我们来学习数据类型检查、原型链、以及ES6新特性class类,原型链是实现继承的主要方法。 其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。 每个构造函数都有一个prototype属性,指向原型对象。
一、数据类型检查
之前我们检查基本数据类型都是用typeof(变量)方法,今天我们来介绍检查复杂数据类型的方法。
检查复杂数据类型我们用instanceof
语法:实例对象 instanceof 类型 //返回一个布尔值 true/false
eg:
arr instanceof Array
=>返回 true | false
特殊:
Array Date -> Object
继承
数组类型
Array.isArray(obj)
返回 true | false
二、一切皆对象
javascript内置对象:
Array Object Date ....
基本数据类型:
string -> String
number -> Number
boolean -> Boolean
函数也是对象:
数据类型 Function
let f = new Function('console.log("hello")')
f()
三、原型链
1.显性原型与隐形原型
显性原型:每个构造函数都有一个prototype属性指向它的原型对象
隐式原型;_proto_是每个对象都有的属性,又称为隐式原型。
但是,___proto__不是一个规范属性,只是部分浏览器实现了此属性,对应的标准属性是[[Prototype]]
* 每个对象都有一个__proto__属性指向它的原型 *
原型对象也是一个对象, 原型对象也有__proto__指向它的原型
原型链图解:
原型链:多个属性,通过隐式原型_proto_连接起来,形成的一种链式结构
作用:访问属性和方法时沿着原项链方法查找,直到null为止
四、ES6新特性class类
class类:面对对象语法
作用: 使用构造函数和原型定义对象属性方法问题更加简易
class 类名{
// 构造器 -> 私有
constructor(name,age){
//属性和方法
this.name = name
this.age = age
}
// 方法 -> 原型->公共
say(){
}
}
let p = new 类名(name,age)
ES6面向对象 class语法
更符合面向对象思维
创建对象之前, 一般先定义对象的类型, 在类型中定义属性和方法,先类型再有对象
代码如下(示例):
// ES5面向对象
function Person(name, age) {
this.name = name
this.age = age
}
Person.prototype.say = function(){
console.log('说话')
}
/*
创建人类,它有姓名name,年龄age属性
*/
class Person {
// 私有
constructor(name, age) {
this.name = name
this.age = age
}
// 公共
say(){
console.log('说话')
}
}
let p = new Person('jack', 18)
console.log(p.name, ' ', p.age)
console.dir(Person.prototype)
console.dir(p)