类和实例是大多数面向对象编程语言的基本概念,js通过原型(prototype)来实现面向对象编程,
类指具有相同属性和方法的泛指的一群对象(人类),实例指具有特性的单个个体(小明)
通过new(语法糖)类得到实例,实例的原型就是类,实例一定具有类的属性和方法,但类不具有实例特有的属性和方法。
之所以使用原型的概念,因为这样可以让多个实例相同的属性方法都指向同一个地址,可以节省内存
ES5通过函数(构造函数)创建类,通过prototype给类添加属性和方法,再new构造函数来创建实例,
ES6直接通过class创建类,在constructor() 里写自身特有的方法属性,在外面写公有方法属性,
私有公有指的是其继承类能否拥有其属性方法,私有公有的属性方法都可以被实例化的对象拥有
关于new的定义:
• 创建一个空对象,将它的引用赋给 this,继承函数的原型。
• 通过 this 将属性和方法添加至这个对象
• 最后返回 this 指向的新对象,也就是实例(如果没有手动返回其他的对象)
Pep = function (name) {
this.name = name
}
Pep.prototype.bb = function (msg) {
console.log(this.name + ' bb:' + msg)
}
var ming = new Pep('xiao ming')
ming.bb('I can')// xiao ming bb:I can
class Animal { //class定义类
//构造方法内定义自己私有的属性方法
constructor() {
this.type = 'animal'
}
//方法外定义公有的属性方法
says(say) {
setTimeout(() => {//箭头函数没有自己的this,是继承外面的
console.log(this.type + ' says ' + say)
}, 1000)
}
}
var animal = new Animal() //创建实例对象
animal.says('hi') //animal says hi 实例对象继承其原型对象的属性方法