原型链

1,189 阅读1分钟

面向对象思想和原型链

面向过程和面向对象都是解决问题的一种思路 面向对象:注重的是结果 面向过程:冒泡排序,两联比较大小,注重的是过程

面向对象的三大特征

封装 :将功能封装到对象或函数里,只暴露指定的接口在外, 继承: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()
复制代码