面向对象思想和原型链
面向过程和面向对象都是解决问题的一种思路 面向对象:注重的是结果 面向过程:冒泡排序,两联比较大小,注重的是过程
面向对象的三大特征
封装 :将功能封装到对象或函数里,只暴露指定的接口在外, 继承: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()