一、面向对象

  • 面向过程:凡事亲力亲为,每件事的具体过程都要知道,注重过程
  • 面向对象:根据需求寻找对象,所有的事都用对象来做,注重结果
  • 面向对象特性:封装、继承、多态(抽象性)
  • js是一门基于对象的语言:js不是面向对象的语言,但是可以模拟面向对象的思想
  • 对象是定义:有特征和行为,具体特指某一事物

二、创建对象的方法

1. 调用系统的构造函数创建对象

       var obj=new Object();//关键词Object,大写首字母
obj.name="小明";
obj.age=20;
obj.sex="男";
obj.play=function(){
console.log("我在玩游戏");
};
obj.showName=function(){
console.log("我叫"+this.name)
}
console.log(obj.name);//小明
console.log(obj.age);//
console.log(obj.sex);//男
obj.play();//我在玩游戏
obj.showName();//我叫小明
  • 这种方法通过new关键字生成一个对象,然后根据JavaScript是动态语言的特性来添加属性和方法,构造一个对象。
  • 在当前的对象的方法中,可以使用this代替当前对象
  • 这种方法的问题在于:如果我们需要多次创建对象,那么就需要重复代码多次,不利于代码的复用。

2.工厂模式:一次性创建多个对象——工厂模式创建对象:利用函数封装起来,后面调用

  • 原始版本
        function creatObj(){
var obj= new Object();
obj.name="关羽";
obj.age=30;
obj.showName=function(){
console.log("我叫"+this.name);
};
obj.showAge=function(){
console.log("我今年"+this.age);
};
return obj;
}
var obj1=creatObj();
var obj2=creatObj();
obj1.showName();//我叫关羽
obj1.showAge();//我今年30
obj2.showName();//我叫关羽
obj2.showAge();//我今年30

这种方法虽然也实现了创建对象,但是同样地,如果需要多次创建对象,而且属性内容不一样的话,也是需要重复代码多遍。需要重新考虑代码重用率,接下来修改代码,使其可以提高代码重复率,而且可以改变工厂方法,传入参数赋值。

  • 改进版本

        function creatObj(name,age){
var obj= new Object();
obj.name=name;
obj.age=age;
obj.showName=function(){
console.log("我叫"+this.name);
};
obj.showAge=function(){
console.log("我今年"+this.age);
};
return obj;
}
var obj1= new creatObj("刘备",32);
var obj2= new creatObj("关羽",30);
obj1.showName();//我叫刘备
obj1.showAge();//我今年32
obj2.showName();//我叫关羽
obj2.showAge();//我今年30

这种方法虽然可以提高代码的重用率,但和面向对象中类的概念相比,有一个很大的缺陷。

面向对象强调对象的属性私有,但对象的方法是共享。而上面的工厂方法在创建对象时,要为每个对象创建各自私有的方法。

同时,由于为每个对象都创建逻辑相同的方法,所以很浪费内存。

  • 最终版本

       function creatObj(name,age){
var obj= new Object();
obj.name=name;
obj.age=age;
obj.showName=showName;
obj.showAge=showAge;
return obj;
}
showName=function(){
console.log("我叫"+this.name);
};
showAge=function(){
console.log("我今年"+this.age);
};
var obj1=new creatObj("刘备",32);
var obj2=new creatObj("关羽",30);
obj1.showName();//我叫刘备
obj1.showAge();//我今年32
obj2.showName();//我叫关羽
obj2.showAge();//我今年30

上面通过定义几个函数对象,解决了不同对象持有函数对象的私有问题。现在所有对象的方法都持有上面两个函数的引用。

但是这么一来,对象的函数和对象又相互独立,这和面向对象中特定方法属于特定类的思想不符合。

3.自定义构造函数创建对象(结合第一种和需求,通过工厂模式创建)

         function Person(name,age){
this.name=name;
this.age=age;
this.showName=function(){
console.log("我叫"+this.name);
};
this.showAge=function(){
console.log("我今年"+this.age);
};
};
var obj1=new Person("刘备","32");
var obj2=new Person("关羽","30");
obj1.showName();//我叫刘备
obj1.showAge();//我今年32
obj2.showName();//我叫关羽
obj2.showAge();//我今年30
  • 构造函数的方法和工厂方法一样,会为每个对象创建独享的函数对象。当然也可以将这些函数对象定义在构造函数外面,这样有了对象和方法相互独立的问题。
  • 使用构造函数存在的最大问题就是每个实例都会将所有的属性创建一次。这个对于数值属性来说可以接受,但是如果函数方法每个实例都要创建一遍,则不合理。
  • 自定义构造函数:  没有var、没有返回值、用this代替当前对象
  • 要创建Person()的新实例,必须使用new操作符。
  • 构造函数和函数的区别:构造函数的名字首字母一般大写
  • 自定义构造函数创建对象做了四件事:
    • 在内存中开辟(申请)空间,存储新的对象
    • 把this设置新的对象
    • 设置对象的属性和方法的值
    • 把this这个对象返回

4.字面量创建对象

      var obj={
name:"刘备",
age:32,
height:"180cm"
}
console.log(obj.name);//刘备
console.log(obj.age);//
console.log(obj.height);//180cm
console.log(obj instanceof Object);//true
  • 字面量创建的对象的缺陷:一次性的对象
  • 注意属性与属性之间用逗号,不是分号

三、一些结论

1.如何获取该变量(对象)是不是属于什么类型?

  • 语法: 变量 instanceof  类型的名字  -------布尔类型,输出是true或者false
  • 类型的名字首字母大写
       var obj={
name:"张飞",
age:32,
};
console.log(obj instanceof Object);//true

2.对象是一组有序属性的集合,属性的值可以是任意的类型

3.点语法:没有什么就点什么,可以设置和获取和获取对象属性

      var obj={
name:"刘备",
age:32,
};
obj.height="180cm";//添加height属性
console.log(obj.name);//刘备
console.log(obj.age);//
console.log(obj.height);//180cm

4.设置和获取属性的另外一种方法是通过[ "   " ],必须有双引号

       var obj={
name:"关羽",
age:"30",
};
obj["height"]="190cm";//添加height属性
console.log(obj["name"]);//关羽
console.log(obj["age"]);//
console.log(obj["height"]);//190cm

5.Json

      var obj={
"name":"刘备",
"age":"32",
"height":"180cm"
}
  • json格式的数据,一般都是成对的,键值对的形式
  • json也是一个对象,数据无论是键还是值都是用双引号括起来的
  • json不能通过for循环遍历,因为是无序的,但是可以通过for……in 循环遍历
      var json={
"name":"某某",
"age":"18",
"height":"180cm"
}
//通过点语法和[]访问
console.log(json.name);//某某
console.log(json["age"]);//
//定义一个变量
var key="age";
console.log(json[key]);//
//推出使用for...in循环遍历
for(var key in json){
console.log(key);//name age height
console.log(json[key]);//某某 18 180cm
console.log(json.key);//undefined 因为点语法会添加一个key属性,而没有值
}

6.数据类型

  • 原始数据类型:Number、String、Boolean、undefined、null、Object
  • 基本类型(简单类型、值类型):Number、String、Boolean
  • 复杂类型(引用类型):Object
  • 空类型:undefined、null
  • 值类型在栈中存储,引用类型在堆和栈上存储-----对象在堆存储,对象的地址在栈存储
  • 值类型传递的是值,引用类型传递的是地址(引用)
 //例1:
var obj={
name:"李白"
};
function f2(obj2){
obj2.name="韩信";
}
console.log(obj.name);//李白
f2(obj);
console.log(obj.name);//韩信
 //例2:

        var num=50;
function f1(num){
num=60;
console.log(num);//
}
f1(num);
console.log(num);//
 //例3:
var num1=55;
var num2=66;
function f1(num,num1){
num=100;
num1=100;
num2=100;
console.log(num);//
console.log(num1);//
console.log(num2);//
}
f1(num1,num2);
console.log(num1);//
console.log(num2);//
console.log(num);//报错
  //例4:
function Person(name,age,salary){
this.name=name;
this.age=age;
this.salary=salary;
}
function f1(person){
person.name="张三";
person=new Person("李四",18,10);
}
var p=new Person("赵六",18,1000);
console.log(p.name);//赵六
f1(p);
console.log(p.name);//张三

对象(面向对象、创建对象方式、Json)的更多相关文章

  1. js中面向对象(创建对象的几种方式)

    1.面向对象编程(OOP)的特点: 抽象:抓住核心问题 封装:只能通过对象来访问方法 继承:从已有的对象下继承出新的对象 多态:多对象的不同形态 一.创建对象的几种方式 javascript 创建对象 ...

  2. 用面向对象的方式操作 JSON 甚至还能做四则运算 JSON 库

    前言 在之前实现的 JSON 解析器中当时只实现了将一个 JSON 字符串转换为一个 JSONObject,并没有将其映射为一个具体的 struct:如果想要获取值就需要先做断言将其转换为 map 或 ...

  3. 【原创整理,基于JavaScript的创建对象方式的集锦】

    以下4种方式,是我在项目中最常见的JavaScript的面向对象的方式的开发. 测试一般在微软的工具:http://www.typescriptlang.org/Playground 进行测试,或者使 ...

  4. Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 在 ...

  5. js中json法创建对象(json里面的:相当于js里面的=)

    js中json法创建对象(json里面的:相当于js里面的=) 一.总结 json里面的:相当于js里面的= 4.json创建js对象解决命名冲突:多个人为同一个页面写js的话,命名冲突就有可能发生, ...

  6. php 面向对象的方式访问数据库

    <body> <?php //面向对象的方式访问数据库 //造对象 $db = new MySQLi("localhost","root",& ...

  7. PHP中将对数据库的操作,封装成一个工具类以及学会使用面向对象的方式进行编程

    <?php class SqlTool { //属性 private $conn; private $host="localhost"; private $user=&quo ...

  8. Java Object 对象创建的方式 [ 转载 ]

    Java Object 对象创建的方式 [ 转载 ] @author http://blog.csdn.net/mhmyqn/article/details/7943411 显式创建 有4种显式地创建 ...

  9. day4-1深入理解对象之创建对象

    深入理解对象 之创建对象: 工厂模式: 工厂模式虽然解决了创建\多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型) 工厂模式问题:那就是识别问题,因为根本无法 搞清楚他们到底是 ...

  10. Javascript面向对象——创建对象、构造函数的原型

    Javascript面向对象--创建对象.构造函数的原型 其实:JavaScript中的创建类,就是创建一个构造函数,在创建对象时用到new这个关键字, 一.创建对象 1.函数创建对象 functio ...

随机推荐

  1. go语言的安装及环境配置

    Go语言开发环境搭建(ubuntu) 1.清理.卸载之前的 go 语言环境: 删除go目录:sudo rm -rf /usr/local/go 删除软链接(如果建立了软链接):sudo rm -rf ...

  2. PB笔记之调用数据窗口时的过滤条件添加方式

    在PB查询数据窗口的数据时 通常可以有两种方式 一是在数据窗口事先写好查询条件,然后用retrieve()函数通过参数传递给数据窗口 这种方式适合查询条件较为简单,条件数较少的数据窗口 二是使用Set ...

  3. 理解javascript中的立即执行函数(function(){})()(转)

    原文:https://www.cnblogs.com/yanzp/p/6371292.html

  4. 滤波器算法(2)-最小均方(LMS)

    2018.09.09 写的版本 ①残差平方和 ②平方损失函数: ③函数的极值点为偏导数为0的点:(将问题变成一个求极值的问题) ④求解得: matlab代码: ① y=ax+b+e方程 functio ...

  5. SQL 多并发 多人取号,防止重复取号SQL 办法

    BEGIN TRAN         SELECT  *  from 表明 WITH(HOLDLOCK)        UPDATE 表名 SET 值=1 WHERE 字段=@carrierNo;   ...

  6. Django配置websocket请求接口

    1.settings.py INSTALLED_APPS = [ '...', 'channels', '...', ] ASGI_APPLICATION = 'server.routing.appl ...

  7. iview-admin本地测试上线登陆问题和文件路径找不到问题

    在项目中vue.config.js下修改上线路径(图中我修改为:根目录路径) 测试本地上线登陆出现问题: 在main.js下if (process.env.NODE_ENV !== 'producti ...

  8. 开发一个简单的工具,导出github仓库所有issue列表

    Jerry有一个github仓库,专门用来存放自己的知识管理,通过一条条的issue来记录具体的知识点: https://github.com/i042416/KnowlegeRepository/i ...

  9. Lumen5.6使用JWT【最新教程】,亲身失败百次的总结

    一.前言 如果需要使用 Passport,可以参考在下之前的教程: 'Lumen5.4配置OAuth2.0[强迫症,就是要用最新版本的Lumen]' . 由于原作者文档的简洁性,同时 Lumen 下的 ...

  10. unittest管理测试用例

    #coding=utf-8 from selenium import webdriver from time import sleep import unittest #导入unittest库 imp ...