# 基础
- 所有的对象都是通过 ···new 函数 ··· 构造函数 创建的
- 所有的函数也是对象 (函数也可以有属性)
- 所有的对象都是引用类型
### 1.原型 prototype (原型是一个对象,也叫原型对象)
- 所有的[函数]都有一个属性:prototype 称之为[函数原型]
- 默认情况下 ,protoype 是一个普通的Object对象, prototype有一个属性constructor,指向构造函数
```
tes t(){}
let obj = new test();
obj.__proto__ === test.prototype
```
JS 原型是指为其它对象提供共享属性访问的对象
### 2. 隐式原型 __proto__ (系统变量[[Prototype]]) 或者对象原型
隐式原型:所有的对象都有 __proto__,又名[[Prototype]],它指向**该对象的构造函数(constructor)的原型proto**
```
<!-- 构造函数 -->
function Person(name) {
this.name = name;
}
Person.prototype.sayName = function () {
return this.name;
};
Person.prototype.__proto__ === Object.prototype ;// true
构造函数 Person 的原型继承自 Object.prototype
```
### 原型链:
A:每个对象都有 __proto__ 属性,它指向原型对象的prototype,原型对象也是对象,也有 __proto__ 属性,并指向它的原型对象,这样一层一层,**最终指向 null (js内核放置的)**,这种关系被称为原型链。
总结:对象的原型,是共享的
给一个对象,加入一个原型属性
实例.__proto__和构造函数.prototype是等价的**
子对象的__proto__ === 父对象的 prototype**