2.6 KiB
2.6 KiB
20191211
- 原型链 原型对象与实例对象之间的关系,是通过__proto__产生联系的
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没有类,但是可以通过构造函数模拟类,通过原型对象机继承,继承的目的是为了共享数据
-
原型的作用之一:共享数据,节省内存
-
原型的作用之二:实现继承
-
多态 同一对象的不同行为或者同一行为针对同一对象产生的不同效果,现有继承后有多态
-
动物类 有名字, 颜色,都能吃
-
狗类 有名字, 颜色,也都能吃, 也能看门
-
大黄 有名字, 颜色, 也能吃,也能叫,能看门,能玩
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)
- 缺陷:不能共享方法
function Student(score, name, age, sex) {
Person.call(this,name,age,sex)
this.score = score
}
var st = new Student(100, '张三', 19, 'male')