原型链
原型链就是实例对象和原型对象之间的链接
每个函数都有一个prototype属性,这个prototype属性就是我们的原型对象
通过new 构造函数出来的实例对象有一个__proto__属性,通过该属性指向他的构造函数的原型对象
这样构造函数和实例对象之间就通过( _proto_ )连接在一起形成了一条链子 就叫做原型链
构造函数
在JavaScript中,用 new 关键字来调用的函数,称为构造函数。首字母一般大写
实例对象
使用 new 调用构造函数 实例化之后 返回的对象
构造函数内部的this会指向实例对象
<script>
function Food() {
this.apple = "apple"
this.a = 1
}
const food = new Food()
console.log(food);
</script>
访问原型对象
构造函数.prototype
实例对象.__proto__
Object.getPrototypeOf(实例对象)
function Food(){
// coding
}
const food = new Food()
// 方法一
Food.prototype
// 方法二 (尽量不使用)
food .__proto__
// 方法三 (替代方法二的 推荐使用)
Object.getPrototypeOf(实例对象)
function Food() {
this.apple = "apple"
this.a = 1
}
// // // 修改原型对象
Food.prototype = {
b: 10,
one: 1,
two: 2,
say() { }
}
var food = new Food()
// 获取原型对象
console.log(Food.prototype);
console.log(food.__proto__);
console.log(Object.getPrototypeOf(food));
原型链的终点是Object.prototype
没有修改原型对象数据
原型对象上还有一个constructor
构造函数的原型对象的constructor 就是构造函数本身
实例的constructor 也是构造函数本身
console.log(Food.prototype.constructor === Food)
console.log(foodOne.__proto__.constructor === Food)
更改了原型对象
需要设置一个 constructor : 构造函数 否则会导致constructor指向出错
function Food() {
this.apple = "apple"
his.a = 1
}
Food.prototype = {
b: 10,
one: 1,
two: 2,
say() {
// console.log('hello');
},
constructor: Food
}
var food = new Food()
console.log(foodOne.constructor);
- 不设置constructor 会直接指向Object
- 设置了constructo