理解__proto__和prototype

本文只帮助本人理解__proto__和prototype。
以下均为本人通过deepseek和网上搜索总结而出,不保证知识点的准确性,只是帮助本人理解。

类与对象 vs 对象与对象

在之前接触的语言(C++、java、python等)中,基本都是类与对象的概念
通过定义一个类作为模板,通过new来实例化一个对象,继承等操作也是在类上进行的

在js中,没有类的概念,除了原始类型外,其他都可视为对象

1
2
3
4
5
6
7
8
9
10
typeof {} // 'object'
typeof [] // 'object'
typeof new Number() // 'object'
typeof null // 'object'(意外设计)
typeof undefined // 'undefinded'不是对象

typeof function(){} // 'function',可调用对象
typeof (()=>{}) // 'function'
typeof class{} // 'function
typeof Number // 'function'

js中的对象

js中想要创建一个对象,只能通过另一个对象来创建,这另一个对象通常为构造函数

1
2
3
4
5
6
7
8
9
function Person(){}

typeof Person // 'function'
typeof Number // 'function'
typeof Array // 'function'

a=new Number()
b=new Array()
c=new Person()

js里的对象可以视作一些属性(字段)的集合
任何对象都可以拥有属于自己的任意属性
通过构造函数创建的对象独自拥有构造函数中的属性

1
2
3
4
5
6
7
8
9
10
11
function Person(name){
this.name=name
}
a=new Person("张三")
b=new Person("李四")

a.name // "张三" 构造函数中的属性
b.name // "李四"

a.age=18 // a自己的属性
b.age // undefinded

原型

我对原型现在还不是很了解,只当“黑盒”来用

如上所说,js中的对象需要由另一个对象创建,而这另一个对象就被称为该对象的原型。
而每个对象都有一个__proto__属性,该属性就指向此对象的原型。

既然原型也是一个对象,那么就有原型的原型,一直往上,直到最顶层为null(可能这就是为什么null的类型为object了吧),这就是原型链。类似于其他语言的类中的继承,js中的对象也有继承,依次继承原型中的属性。

__proto__和prototype

原型并不是这个另一个对象(原构造函数),而是独立出来的一个对象,称为原型对象,存储着共享属性,可被继承
实例对象通过__proto__访问原型
构造函数通过prototype访问原型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function Person(){}
p1=new Person()
p1.name="张三" // p1独有属性
p1.__proto__.age=18 //原型对象属性

p2=new Person()
p2.name // undefinded
p2.age // 18, 通过原型链继承而来

Person.age // undefinded, 构造函数中没有age属性
Person.prototype.age //18

p1.hasOwnProperty('age') // false,
p2.hasOwnProperty('age') // false
Person.hasOwnProperty('age') // false

p1.__proto__.hasOwnProperty('age') // true,原型对象拥有age属性
p2.__proto__.hasOwnProperty('age') // true
Person.prototype.hasOwnProperty('age') // true

参考资料:
https://segmentfault.com/a/1190000042725370


理解__proto__和prototype
http://example.com/2026/01/05/proto/
作者
Naby
发布于
2026年1月5日
许可协议