原型和原型链

Martin

显式原型 prototype

隐式原型 proto

prototype 是函数的一个属性 创建函数时会默认添加prototype这个属性

prototype 是一个对象

__proto__是对象上的属性 指向构造函数的prototype

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 function test (name) {
this.name = name
}
const obj = new test('张三')
console.log(obj)
console.log(obj.__proto__)
console.log(test.prototype)
console.log(obj.__proto__ === test.prototype);
console.log(test.prototype.__proto__ === Object.prototype);
//obj {
// __proto__: test.prototype = {
// __proto__: Object.prototype = {
// __proto__: null
// }
// }
//}

总结:实例化对象的__proto__指向其构造函数的prototype,

构造函数的prototype.__proto__指向其对象的构造函数Object.prototype

构造函数Object.prototype.__proto 指向null

当寻找一个对象属性时,先从对象自身查找,直到找到null

proto 读作“dunder proto”,“double underscore proto”的缩写。并且它前后两边 分别是 两个 “_”(下划线)。

假设有一个对象 obj 其是由构造函数 function test(name) { this.name=name } 使用关键字new出来 这时称这个对象为实例化对象obj

其原型链如下:

obj.proto–>test.prototype.proto(obj对象的构造函数)–> Object.prototype.__proto –> null