69 lines
2.6 KiB
Markdown
69 lines
2.6 KiB
Markdown
# 20191211
|
||
|
||

|
||
|
||
* 原型链 原型对象与实例对象之间的关系,是通过__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')
|
||
```
|