1. Class 铺垫
2. 回顾了解ES5
- 构造函数
- 私有属性和公有属性
- 私有属性继承和公有属性继承
Union.prototype.public = function(){
console.log('公有属性访问')
}
function Union(){
this.name = 'LOL',
this.age = '666',
this.kill = function(){
console.log('五杀')
}
}
var hero = new Union()
var hero1 = new Union()
hero.public()
hero1.public()
私有属性:函数里面用 this 挂载的属性是私有属性 ,在 new 操作执行时,生成一个this对象,然后创建新的私有属性。
公有属性:Union.prototype.public;原型链挂载的属性是公有属性, hero和 hero1 都能访问 public 这个属性
私有属性继承和公有属性继承:
__proto__实现继承 ;原型链的继承;查找一个属性的时候,自身是否有属性,没有就沿着作用域链的顶端查找,这种 形式避免继承了一些私有属性,达到了高效共享原型的形式
Union.prototype.public = function(){
console.log('公有属性')
}
function Union(name){
this.name = name || 'LOL',
console.log(this.name)
this.age = '666',
this.kill = function(){
console.log('五杀')
}
}
//下面这种形式的写法,如果对 __proto__ 属性理解不深刻,很容易发生错误
// Rope.prototype.__proto__ = Union.prototype
//建议使用下面这种形式,系统提供设置 共享原型 API ;概念理解和 __proto__ 继承是相同的
Object.setPrototypeOf(Rope.prototype,Union.prototype)
Rope.prototype.wind = function(){
console.log("风墙")
}
function Rope(name){
this.name = '斩杀'
Union.call(this,name)
}
var oAP = new Rope()
知识拓展:
// 这种形式也能实现属性继承
Rope.prototype = Object.create(Union.prototype,{
constructor : Rope
})
3. ES6 之 Class
class 是ES6提供的语法糖。
class 构造的原型不能枚举。
class 必须 new,不然报错
class Union {
//静态方法(static);是自身构造函数的属性方法;不是在原型里面定义的
static Rope (){
return '斩杀'
}
constructor() {
this.name = "LOL"
this.age = "666"
}
kill() { //定义在原型上面的方法
console.log("五杀");
}
}
var oAP = new Union()
控制台输出:
构造函数定义的 kill 方法在__proto__属性里面。
- extends 继承
class Union {
static Rope (){
return '斩杀'
}
constructor(name) {
this.name = name || "LOL"
this.age = "666"
}
kill() {
console.log("五杀");
}
}
//extends 属性继承
class Rope extends Union{
constructor(name){
super(name) // 相当于 Union.call(this,name) 的形式
this.recruit = '风墙'
}
}
var oAP = new Rope()