nodebook/20191211/20191211.md
2019-12-21 09:55:46 +08:00

69 lines
2.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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')
```