javaScript 面向对象之构造函数、工厂方式、字面量

作者:极客小俊
我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人!
原创技术文章

javaScript 面向对象之构造函数、工厂方式、字面量

javascript.png
什么是面向对象编程?

面向对象的英文全称:==Object Oriented Programming== , 简称==OOP==

首先我们要先了解面向过程的编程思想, 就是代码从上到下都没有封装的意思,某写代码裸露在外、没有模块化、代码杂乱无章的写法. 并且还不好维护,也不便于后期二次修改

面向对象的编程思想: 通俗的说就是要具备代码好维护、代码重用性高、耦合度低、高内聚、模块化、便于修改

名词解释:

高内聚: 指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。

低耦合: 指让每个模块尽可能的独立完成某个特定的子功能。

面向对象的主要特点:

  1. 抽象:抓住核心问题, 去掉相关性不强的代码, 把类似一样的功能性代码放在一起、

    [把这个功能所需要的相同功能代码抽取出来,然后进行封装]

  2. 封装:只能通过对象来访问方法 [提高可维护性]

  3. 继承:从已有对象上继承出新的对象 [提高代码重用性]

  4. 多态:让同一个[接口] 被不同的对象所继承或者实现,从而产生不同的处理方式

js是一门基于对象的语言

js是一门解释型的语言

js是一门脚本语言、弱类型语言!

==分析什么是对象?==

对象:具有特征和行为或者说 有==属性==和==方法==, 具体特指的某一个事物

对象的组成

==属性== 就是变量 表示一个对象的状态 对象下面的变量就叫做:==属性==

==方法== 就是函数 表示一个对象的行为过程 对象下面的函数就叫做:==方法==

javascript创建对象的三种基本方式
1.调用系统的构造函数创建对象

创建对象也叫实例化对象, Object是系统的构造函数

//语法
var 变量名 = new Object();

如何添加对象的属性和方法

添加属性: 如何添加属性?

var 变量名 = new Object();
变量名.属性名=值;

添加方法: 如何添加方法?

var 变量名 = new Object();

变量名.方法名=function(){ 
    ..代码段...
} 
    
或

function 函数名(){
    
}
变量名.方法名=函数名;

案例:

var obj=new Object();
obj.name='张三';
obj.age=33;
obj.city='重庆';
obj.say=function(){
    alert('张三说话了!');
}
console.log(obj);

==这种创建方式的缺点是:==

1.如果使用这种方式创建了多个对象、会产生对象不能分辨出到底属于哪一个类型!

2.每创建 一个对象都需要new Object() 一次 耗费内存空间、 不能一次性创建多个对象

==小知识:== 如何判断某一个对象引用变量是不是属于某一个类型?

语法: 对象引用变量名称 instanceof 类名称 返回true就是属于这个类 返回false不属于这种类型

==this关键字的基本使用==

在当前的对象方法中,可以使用this关键字代表当前对象

==小知识:== 访问对象属性和方法的另一种写法: 对象[“属性名”] 或 对象方法名

案例代码如下:

var obj2=new Object();
obj2.name='李四';
obj2.age=66;
obj2.city='北京';
obj2.say=function(){
    console.log('李四说话了');
    console.log(this.name);
}
console.log(obj2["name"]);
obj2["say"]();

2.工厂方式与构造函数

工厂方式也可以叫做封装函数

==优点:== 代码复用性提升、不同的数据当做参数进行传递

<code>自定义构造函数创建对象</code>

了解一下如何一次性创建多个对象?

工厂方法 方法1: 首先把创建对象的系统构造对象相关代码封装在一个函数中,不同的数据当做参数进行传递,然后返回创建好的对象

案例代码如下:

function createObject(username,age){
    var obj=new Object();
    obj.name=username;
    obj.age=age;
    obj.city='重庆';
    obj.say=function(){
        console.log(this.name+'的年龄是:'+this.age);
    }
    return obj;
}

var obj1=createObject('张三',23);
var obj2=createObject('李四',66);
obj1.say();
obj2.say();

工厂方法 方法2:自定义构造函数创建对象, 自己定义一个构造函数,创建对象

==优点: 可以区分出对象引用属于哪一类==

案例代码如下

//Person就是构造函数
function Person(username,age,city){
    this.name=username;
    this.age=age;
    this.city=city;
    this.say=function(){
        console.log(this.name+'的年龄是:'+this.age);
    }
}


var obj1=new Person('张三',33,'北京市');
var obj2=new Person('李四',66,'重庆市');
obj1.say();
obj2.say();

小结: 通过上面的案例可以小结出一个概念: 就是函数如果前面有new关键字,那么这个函数就是构造函数,否则就是一个普通函数

==在javascript中使用new关键字来修饰一个 普通函数的解答

系统做4件事情

  1. 首先这个函数就成为了 构造函数, 因为 new 后面跟一个函数 这样的函数就叫构造函数

  2. 在内存中开辟一块(申请一块空闲的空间)空间,存储创建的新对象

  3. 构造函数中的this就设置为当前的对象

  4. 就是说当new写在一个函数前面的时候、这个函数中的this就是创建出来的对象、并且函数的返回值直接默认就是this了 隐式返回,可以使用如下代码进行测试得出结论

    function Obj() {
    
    }
    //观察返回值
    console.log(Obj());       //undefined
    console.log(new Obj());   //Obj {}
    //所以this这个对象会返回, [ 这里的返回是自动的 无需在构造函数中使用return]
    
  5. 如果有设置对象的属性和方法就设置值

3.字面量的方式创建对象

json对象是创建对象的一种字面量表示形式

var 变量名 = { } //这就叫字面量方式创建对象

案例代码

var obj={};
obj.name='张三';
obj.age=22;
obj.city='北京市';
obj.fn=function () {
    console.log('我的名字叫'+this.name+' 我的年龄是:'+this.age+' 我在'+this.city+'生活和工作!');
}

obj.fn();

==推荐写法:==

字面量优化后的形式:其实就是json数据格式的形式 [推荐写法]

案例代码

var obj2={
    name:'张三',
    age:22,
    city:'北京市',
    fn:function () {
        console.log(this);
        console.log('我的名字叫'+this.name+' 我的年龄是:'+this.age+' 我在'+this.city+'生活和工作!');
    }
};

obj2.fn();

==注意==: var obj =new Object() 与 var obj = { } 是完全一样的 只是一个在内存中的堆区中开空间 而另一个在栈区开辟空间

function Obj() {
    
}
var test=new Obj();  //在内存中的堆区中开空间
console.log(test);

var json={}         //在栈区开辟空间 用完即释放
console.log(json);
end.jpg
bilibili_gif.gif

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!


如果以上内容有任何错误或者不准确的地方,欢迎在下面 👇 留个言指出、或者你有更好的想法,欢迎一起交流学习

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容