面向对象思想和原型链
面向过程和面向对象都是解决问题的一种思路 面向对象:注重的是结果 面向过程:冒泡排序,两联比较大小,注重的是过程
面向对象的三大特征
封装 :将功能封装到对象或函数里,只暴露指定的接口在外, 继承:js中继承是对象之间的继承,如果一个对象想要有另一个对象是成员,就继承另一个对象
继承的方式
混入式继承
let wang={
house:{
addres:'北京',
price:2000010
},
car:{
name:'劳斯莱斯'
price:2222222
}
}
let hang={
girlFriends:['热巴','林更新']
}
//如果hang这个对象想有wang对象的所有属性
for(let key in wang){
hang[key]=wang[key]
}
复制代码
替换原型式继承
let obj={
name:'jack',
age:15
}
function Student(study){
console.log('hello world')
}
Student.prototype.say=function(){console.log(`我是${this.name}`)}
Student.prototype=obj
let stu1=new Student(['小明','小张'])
console.log(stu1.say())
复制代码
混合式原型继承
//3.混合式
let wangjianlin = {
house:{
address:'东京',
price:10000000
},
car:{
brand:'劳斯奈斯.幻影',
price:5000000
}
}
//准备一个ZhaNan构造函数
function ZhaNan(gfs) {
this.gfs = gfs;
}
//每一个渣男都有一个哄女孩子吃6块钱麻辣烫的方法.
ZhaNan.prototype.huaQian = function(){
console.log('我是渣男,我会请女孩子吃6块钱麻辣烫...');
}
//我们希望每一个ZhaNan实例化对象,都能拥有王健林这个对象的成员,那就要继承
for(let key in wangjianlin){
ZhaNan.prototype[key] = wangjianlin[key];
}
//实例化一个渣男对象
let lvqun = new ZhaNan(['伍菇凉','俊伟','龙翔']);
console.log(lvqun);
复制代码
原型链
每个对象都有原型,原型也是对象,原型也有原型,就形成了一个原型链 原型链作用: 对象访问成员的访问规则:如果对象访问某个成员,先看自己有木有,自己有就访问自己的,自己没有就访问原型的,如果原型也没有,就沿着原型链一直往上查找,直到找到为止,如果找到头还没有找到,就返回undefined或报错
在构造函数里声明方法,外部多次调用,会造成内存浪费 原因:构造函数里声明方法,外部每一次调用都会在堆的创建一个空间,就会造成内存浪费
解决构造函数内存浪费方法一:
//在外部声明一个函数
function add(){
console.log(`我是${this.name},年龄${this.age}`)
}
function Person(name,age){
this.name=name
this.age=age
this.say=add
}
let p1=new Person('jack',15)
console.log(p1.say())
复制代码
原型对象
原型对象是为了解决构造函数的内存浪费 原型对象的好处 :1 解决构造函数的内存浪费 2 解决变量名污染
function Person(name,age){
this.name=name
this.age=age
}
Person.prototype.say=function(){
console.log(`我是${this.name},年龄${this.age}`)
}
let p1=new Person('jack',15)
p1.say()
复制代码