[TOC]
## JavaScript原型,原型链
所有的实例对象都可以继承构造器函数中的属性和方法。但是,同一个对象实例之间,无法共享属性,浪费内存资源。
~~~
function Person(name,age){
this.name = name;
this.age = age;
this.sayHello = function(){
console.log(this.name + "say hello");
}
}
var girl = new Person("bella",23);
var boy = new Person("alex",23);
console.log(girl.name); //bella
console.log(boy.name); //alex
console.log(girl.sayHello === boy.sayHello); //false
~~~

> 由sayHello的==结果看出,New的实例中sayHello方法并不是同一个方法。实际上New一个实例对象的时候,就会创建一个sayHello方法,这样会浪费内存资源。
所以我们将方法写在原型上。(js中每个数据类型都是对象,除了null 和 undefined,而每个对象都是继承自一个原型对象 )
~~~
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.sayHello = function () {
console.log(this.name + ":balabala");
}
var girl = new Person("bella", 23);
var boy = new Person("alex", 23);
console.log(girl.sayHello === boy.sayHello); //true
~~~

> 给Person的prototype一个sayHello方法,Person、girl、boy都可以使用该方法。
* * *
### Person.prototype到底是什么?\_\_proto\_\_又是什么?
> propotype是构造函数的属性(实例化对象没有该属性),指向该构造函数的原型。
> \_\_proto\_\_是JS创建的对象的内置属性(指针),用于指向创建它的构造函数的原型对象。

~~~
console.log(Person.prototype);//找到上一级,找到父亲辈
console.log(girl.__proto__);//相当于向上跳了两级,找到爷爷辈
//console.log(girl.__proto__ === Person.prototype);//true
~~~

* * *
### constructor是什么?
> constuctor是原型对象的属性。
~~~
console.log(Person.prototype.constructor===Person);//true
~~~
constructor属性是定义在原型对象上面,意味着也可以被实例对象继承
~~~
console.log(Person.constructor);//Function
console.log(girl.constructor);//Person
~~~
每个对象在创建时都会因为原型对象的继承关系,自动拥有一个constructor属性,指向其构造函数。
因此,我们下面这条语句的结果为true
~~~
console.log(girl.constructor === girl.__proto__.constructor);//true
左边使用的是:实例girl从原型对象继承下来的constructor属性
右边使用的是:实例girl的构造函数的原型对象自有的constructor属性
~~~
* * *
### 原型链:所有对象皆有\_\_proto\_\_属性,它指向它构造函数的原型对象,它们最终指向Object
~~~
console.log(girl.__proto__);
~~~

~~~
实际上,我们执行以下代码就可以验证,所有对象的原型都指向object
console.log(Person.__proto__);
console.log(Function.__proto__);
console.log(Object.__proto__);
~~~

- 面试题
- 自我介绍
- 问答
- HTML
- 1.@import与link的区别
- CSS
- 1.display: none; 与visibiliy: hidden; 的区别
- 三角形
- margin-top
- 移动端适配问题
- JavaScript
- JavaScript原型和原型链
- 什么是promise
- call、apply、bind区别
- 用函数将字符串转化为驼峰命名
- 数组操作
- 1.筛选
- 2.排序
- 3.反转
- 4.去重
- 字符串方法
- 5.二叉树
- 6.克隆数组
- 重载
- (待完善)JavaScript事件
- dom事件流
- 四则运算符
- cookie,LocalStorage,sessionStorage
- 浅拷贝和深拷贝
- 对象
- 浏览器
- web性能优化
- 定时器
- 回调地狱
- 遍历的几种方式
- this指向
- HTTP
- 输入ur发生了什么
- ajax
- 跨域
- jquery跨域
- axios
- vue
- (待完善)缓存
- bootstarp
- es6
- 01解构赋值
- (未完成)class
