prototype是一个原型|原型对象
- prototype是函数的一个属性
- prototype是一个对象
- 当我们创建函数的时候会默认添加prototype这个属性的
__proto__对象原型(原型链)- 对象的属性
- 指向构造函数的prototype
- 原型链的顶层 Object.prototype.__proto = null
从属关系
● prototype -> 函数的一个属性:对象{}
● proto ->对象Object的一个属性:对象{}
● 对象的__proto__保存着该对象的构造函数的prototype 从属关系
function Test(){}
let obj = Test();
//prototype是函数的一个属性(创建函数系统为我们分配的)
console.log(Test.prototype) //{}
//__proto__是对象的有一个属性(创建对象系统为我们分配的)
console.log(obj.__proto__) //{}
function Test() {}
const test = new Test();
console.log(test.__proto__);//{}
function Test(){}
let obj = Test();
//prototype是函数的一个属性(创建函数系统为我们分配的)
console.log(Test.prototype) //{}
//__proto__是对象的有一个属性(创建对象系统为我们分配的)
console.log(obj.__proto__) //{}
//产生的联系:实例化对象的proto等于构造函数的prototype
console.log(obj.__proto__ === Test.prototype) //true
//我们知道函数的prototype是{},然而每一个对象{ }都有一个属性__proto__
// 于是我们看看Test.prototype.__proto__是啥
console.log(Object.prototype)
既然Object.prototype是一个对象,那么我们看看Object.prototype.__proto__是啥
console.log(Object.prototype.__proto__)//null 也就是原型链的底层了
总体览图
obj{
__proto__:Test.prototype={
__proto__:Object.prototype={
__proto__:null
}
}
}
原型链的查找规则
先从自身去找,找不到顺着链子一层一层往上找
function Test() {
this.a = 1;
}
const test = new Test();
console.log(test);//Test {a: 1}function Test() {
this.a = 1;
}
const test = new Test();
console.log(test);//Test {a: 1}
对应的原型链图
test:{
a:1,
__proto__:Test.prototype={
__proto__:Object.prototype={
__proto:null
}
}
}
function Test() {}
const test = new Test();
Test.prototype.b = 2;
console.log(test.b);//2
对应的原型链图
test:{
__proto__:Test.prototype={
b:2,
__proto__:Object.prototype={
__proto:null
}
}
}
function Test() {}
const test = new Test();
Object.prototype.c = 3;
console.log(test.c); //3
对应的原型链图
test:{
__proto__:Test.prototype={
__proto__:Object.prototype={
c:3,
__proto:null
}
}
}