javaScript(二十二)面向对象

let co1={

name:“co1”,

base:function(){return ‘hh’}

}

let co2={

name:“co2”,

base:function(){return ‘hh2’}

}

为了简化重复代码,首先演变了一种叫做“工厂模式”

function Co(name,age) {

return {

name:name,

age:age,

sayName:function(){

console.log(this.name);

}

}

}

var aa=Co(‘aa’,16),

ab=Co(‘ab’,2);

这种模式的优点是大大简化了重复代码,但是有一个问题,这个是不是对象实例**,出现了对象识别问题;**

因此继续演变成“构造函数”模式,通过new来实例化对象

function Co1(name,age) {

this.name=name;

this.age=age;

this.sayName=function(){console.log(this.name);}

}

var aa=new Co1(‘aac’,16),

ab=new Co1(‘abc’,2);

构造函数模式的优点是:实例化的对象都是指向的构造函数,而且继承自Object,可以调用Object的方法

但是这个构造函数模式有一个问题,如下

console.log(aa.sayName===ab.sayName); //false

同样的实例化,但是不同实例的同名函数不同

因此,继续演变,成了**“原型模式”,**

function Co2() {}

Co2.prototype.name=“asd”;

Co2.prototype.age=12;

Co2.prototype.sayName=function(){console.log(this.name)}

var ac=new Co2(),

ad=new Co2();

console.log(ac.sayName===ad.sayName);

这边的不同函数,就解决了不同实例的同名函数问题;

这种模式的优点:除了简化代码,实例对象之外,每个实例化对象不仅可以拥有自身的属性,还可以去追溯原型上的属性,假如有就用自己的,假如没有,就用原型的

function Co2() {}

Co2.prototype.name=“asd”;

Co2.prototype.age=12;

Co2.prototype.sayName=function(){console.log(this.name)}

var ac=new Co2(),

ad=new Co2();

console.log(ac.sayName===ad.sayName);

ac.name=“asdff” //这时的name属性就是asdff了

delete ac.name; //删除name属性后,name属性又会去取原型上的name属性

进一步简化:将大量prototype写在一个对象里

function Co3() {}

Co3.prototype={

name:123,

age:123,

sayName:function(){console.log(this.name)}

}

var ac=new Co3();

console.log(ac.constructor === Co3); //fasle

console.log(ac.constructor === Object); //true

但是这个又出现了一个新的问题,简化后的写法指向的不是构造函数,而直接是顶层对象Obejct,也可以说没有指向父级,直接指向了爷爷级

那么修改:

function Co3() {}

Co3.prototype={

constructor:Co3, //设置constructor为当前构造函数

name:123,

age:123,

sayName:function(){console.log(this.name)}

}

var ac=new Co3();

console.log(ac.constructor === Co3); //fasle

console.log(ac.constructor === Object); //true

那么所有的原型模式都存在一个缺点传址类型字段都会相互修改,如下例

传址:不是原始值类型,是对象类型的都是传址的

function Co3() {}

Co3.prototype={

constructor:Co3,

name:123,

age:123,

book:[],

sayName:function(){console.log(this.name)}

}

let ad=new Co3(),

ae=new Co3();

ad.book.push(123);

console.log(ad.book); //[123]

console.log(ae.book); //[123]

我们没有对ae进行修改,但是因为ad的push修改,导致了原型被修改,原型一旦被修改,那么所有以原型为实例化的对象都遭到了修改

因此(重点)

取各方的优势,将构造函数写法和原型模式写法组合

function Co4(name,age){

this.name=name;

this.age=age;

this.book=[]

}

Co4.prototype={

constructor:Co4,

sayName:function(){

console.log(this.book)

}

}

let af=new Co4(‘qqq’,20),

ag=new Co4()

af.book.push(999)

console.log(af.book); //[999]

console.log(ag.book); //[]

将所有传值类型的参数的全部放到构造函数中,解决了相互影响,将所有方法放在原型也就是prototype中

继承

大概就是:子对象对继承父级对象的属性和方法,比如构造函数继承了Obejct,实例对象继承了构造函数,那么实例对象和构造函数都可以使用Object上的属性和方法,也就是一直说的原型链

function Co4(name,age){

this.name=name;

this.age=age;

this.book=[]

}

Co4.prototype={

constructor:Co4,

sayName:function(){

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
片转存中…(img-PDwtcrfY-1715529293718)]

[外链图片转存中…(img-Nc2bvFnV-1715529293718)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值