# 20191211 ![js](https://img.shields.io/badge/language-js-orange.svg) * 原型链 原型对象与实例对象之间的关系,是通过__proto__产生联系的 ```js var box = document.getElementById('div') // 实例对象的__proto__必然指向一个构造函数的原型对象prototype box.__proto__ = HTMLDivElement.prototype HTMLDivElement.__proto__ = HTMLElement.prototype HTMLELement.__proto__ = Element.prototype Element.__proto__ = Node.prototype Node.__proto__ = EventTarget.prototype EventTarget.__proto__ = Object.prototype Object.__proto__ = null ``` * 面向对象思想编程,提出需求,抽出相关对象,分析和总结对象的特征和行为,把特征定义成成属性,把行为定义成方法,定义构造函数 * 通过构造函数的属性和方法,来完成相关需求 * js不是一门面向对象的语言,而是基于对象的一门语言 * 面向对象编程思想,都有类的概念,但是js没有类,但是可以通过构造函数模拟类,通过原型对象机继承,继承的目的是为了共享数据 * 原型的作用之一:共享数据,节省内存 * 原型的作用之二:实现继承 * 多态 同一对象的不同行为或者同一行为针对同一对象产生的不同效果,先有继承后有多态 * 动物类 有名字, 颜色,都能吃 * 狗类 有名字, 颜色,也都能吃, 也能看门 * 大黄 有名字, 颜色, 也能吃,也能叫,能看门,能玩 ```js function Animal(name, color) { this.name = name this.color = color } Animal.prototype.eat = function() { console.log('能吃') } // 创建狗类 function Dog(weight) { this.weight = weight } // 改变原型指向实现继承 Dog.prototype = new Animal('大黄','黑色') Dog.prototype.bark = function() { console.log('能叫能看门') } // 创建大黄 function DaHuang(sex) { this.sex = sex } DaHuang.prototype = new Dog('50Kg') DaHuang.prototype.play = function() { console.log('逗主任玩...') } var dh = new DaHuang('male') console.log(dh.name, dh.color, dh.weight, dh.sex) ``` * 通过原型进行继承,改变原型的指向 -> 数据共享 * 缺陷:因为改变原型指向实现继承,必须同时进行初始化赋值,所以导致属性重复,如果想改变属性,只有通过调用对象属性重新赋值 * 解决属性重复赋值的问题 -> 通过借用构造函数来实现继承 * 借用构造函数 构造函数名.call(this, 属性1, 属性2) * 缺陷:不能共享方法 ```js function Student(score, name, age, sex) { Person.call(this,name,age,sex) this.score = score } var st = new Student(100, '张三', 19, 'male') ```