普通函数:
- 默认没有返回值
- this指向window
构造函数
- 默认返回这个对象
- this指向对象
- 使用this给对象绑定属性
- 默认返回这个空对象
let Two = function () {
//空函数
//1.{}
//2.将构造函数this--->{}
//3.使用this给空对象绑定属性 {}
//4.隐式返回{}
}
原型链
话不多说 码上去
这里写了一个构造函数,两个属性name和age,一个方法eat,使用this添加属性和方法。
let One = function (name, age) {
this.name = name;
this.age = age
this.eat = function () {
console.log(this.name + '爱吃排骨,并且年龄' + this.age + '了。')
}
}
实例化One这个构造函数,OneFunObj 这个实例化对象就拥有了One的属性和方法,并赋值name=胡歌;age=18,还拥有eat这个方法。直接OneFunObj 这个对象点属性或者方法就可以使用。
let OneFunObj = new One('胡歌', 18)
console.log(OneFunObj.name) //胡歌
console.log(OneFunObj.age) //18
OneFunObj.eat() //胡歌爱吃排骨,并且年龄18了。
我们发现OneFunObj 是个对象,这个对相还有个属性__proto__,我们知道每一个对象都会默认有一个__proto__,我们随便Let一个obj都会有一个__proto__属性。
console.log(OneFunObj.__proto__, 'OneFunObj')
console.log(One.prototype, 'One')
console.log(OneFunObj.__proto__ === One.prototype)
不难发现,上面执行结果
惊奇的发现这个实例化对象OneFunObj它的__proto__正好是One这个构造函数的prototype。它两个是完全相等的,并且构造函数的prototype中有属性constructor所对应的正好的该构造函数。
说明
实例对象.proto == 构造函数.prototype == 原型对象
类
类本身也是构造函数,也类似于构造函数的语法糖。
它是ES6中新增的一个关键字(语法糖), 用于定义一个类的, 类似于ES5中的构造函数, class中可以声明构造函数, 属性和方法, 像一套模板, class的绝大部分功能,ES5 都可以做到,新的 class 写法, 只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。
基础使用
class Person {
constructor() { // 构造函数
this.name = ""; // 属性
this.age = 0;
}
play () { // 方法 (会自动帮你添加到原型上)
console.log("我会玩");
}
}
let stu = new Person();
console.log(stu);
constructor
它是class定义类时, 使用的构造函数(固定名称), 当new 类()的时候, 构造函数就会触发. (起到一个初始化实例对象的作用)
有参数的构造方法 / 无参数的构造方法, 影响new 时传值和构造函数中使用。
Person的方法play会自动添加到stu的原型上。
class zjq {
constructor(name, age) {
this.name = name
this.age = age
}
eat() {
console.log(this.name + '今年' + this.age)
}
}
class xiaobai extends zjq { //xiaobai继承zjq
constructor(name, age) {
super(name, age)
}
}
console.log(xiaobai.prototype.__proto__ == zjq.prototype) //true
let obj = new xiaobai('zjq', 18)
console.log(obj)
obj.eat() //zjq今年18
xiaobai继承zjq,zjq的属性方法会继承到xiaobai的prototype上,obj这个实例对象就拥有了原型链上的方法。
他们的关系是