基本概念

ECMA关于对象的定义是:”无序属性的集合,其属性可以包含基本值、对象或者函数。“对象的每个属性或方法都有一个名字,而每个名字都映射到一个值。

在现实生活中,相似的对象之间往往都有一些共同的组成特征。类,实际上是对象的设计蓝图或者制作配方。我们能基于相同的类创建出许多不同的对象,这些对象又会含有各自的属性和方法。

封装

封装主要用于阐述对象中所包含(或封装的内容),它通常由两部分组成:

  1. 相关的数据(用于存储属性)
  2. 基于这些数据所能做的事(所能调用的方法)

聚合

聚合是指我们将现有对象合并成一个新对象的过程。例如:Book是由一个或多个author对象,publisher对象、若干chapter对象等组合而成的对象。

继承

通过继承这种方式,我们可以非常优雅地实现对现有代码的重用。例如:我们定义了一个Person对象,他包含了wolk(),sleep(),speak(),eat()等方法,也包含了age,height,weight等属性,这时当我们再定义一个coder对象的时候,你不必将上述的属性和方法都重写一遍,你只需继承他即可,然后你只需将coder这个对象属于他自己的那部分特殊功能写出来。

多态

上述实例中,我们的coder对象继承了person对象的一些属性和方法,这意味着这两个对象都实现了"speak"等方法,现在,我们的代码中有一个叫做James的变量,即便是我们不知道它是一个person对象还是一个coder对象的情况下,也依然可以直接调用该对象的"speak"方法
。类似这种不同对象通过相同的方法调用实现各自行为的能力,我们就称之为“多态”

创建对象

我们可以通过对象直接量、new关键字和object.create()函数来创建。

对象直接量

创建对象最简单的方法就是在js中使用对象直接量,它是由若干名/值对组成的映射表,名/值对中间用冒号分隔,多个名/值对用逗号分隔。整个映射表用花括号({})括起来。

  1. var empty = {};//没有任何属性的对象
  2. var fruits = {apple:big , orange:yellow};
  3. var company = {
  4. CEO : "Tim Cook",//属性名字里有空格,必须用字符串表示
  5. Designer:"Ive";
  6. "for":"all audiences",//"for"是保留字,必须用引号
  7. employees:{
  8. firstname:"David", //这里的属性名都没有引号
  9. lastname:"fill" //这个属性的值是一个对象
  10. }
  11. };

对象里还可以嵌套对象(company里嵌套了employees对象)

new关键字创建对象

关键字new后面跟随一个函数调用,这个函数称为构造函数(constructor)javascript语言核心的原始类型都包含内置的构造函数。

  1. <script type="text/javascript">
  2. var obj = new Object();//创建一个空对象,和{}一样
  3. var arr = new Array();//创建一个空数组,和[]一样
  4. </script>

js原型->参照:javascript学习总结(五)原型和原型链详解

工厂模式

由于ECMAScript中无法创建类,因此,开发人员发明了一种函数,用函数来封装以特定接口创建对象的细节:

  1. <script type="text/javascript">
  2. var Car = (function(){
  3. var Car = function(model,year,miles){
  4. this.model = model;
  5. this.year = year;
  6. this.miles = miles;
  7. };
  8. return function(model,year,miles){
  9. return new Car(model,year,miles);
  10. }
  11. })();
  12. var Benz = new Car("Benz",2014,1000);
  13. var Audi = new Car("Audi",2013,800);
  14. </script>

什么时候使用工厂模式?

以下几种情景下工厂模式特别有用:

  1. 对象的构建十分复杂
  2. 需要依赖具体环境创建不同实例
  3. 处理大量具有相同属性的小对象

元素、属性和方法

说到数组,我们常说其中包含的是元素,而当说到对象的时候,我们常会说其中包含的是属性。另外,对象的属性也可以是一个函数,因为函数本身也是一种数据,在这种情况下,我们会称该属性为方法:

  1. <script type="text/javascript">
  2. var wolf = {
  3. name :wolffy
  4. run:function(){
  5. alert("wolf,wolf!");
  6. }
  7. }
  8. </script>

调用对象方法

  1. <script type="text/javascript">
  2. var parrot = {
  3. name : "bage",
  4. hair : "brown",
  5. say : function(){
  6. alert( 'I am ' + parrot.name);
  7. }
  8. }
  9. parrot.say();
  10. </script>

注:

  1. 1. 尽量使用点号表示法来访问对象的属性和方法。
  2. 2. 不要在对象中使用带引号的属性标示。

构造器函数

另外,我们还可以使用构造器函数的方式来创建对象。看下面一个例子:

  1. <script type="text/javascript">
  2. function Person(name,age,occupation){
  3. this.name = name;
  4. this.age = age;
  5. this.occupation = occupation;
  6. this.sayName = function(){
  7. alert(this.name);
  8. }
  9. }
  10. var person1 = new Person("trigkit4",21,"student");
  11. var person2 = new Person("Jack",25,"Engineer");
  12. </script>

优点

使用构造器函数的好处在于,它可以在创建对象时接收一些参数。按照惯例,构造函数的函数名应始终以一个大写字母开头,以区分普通函数。

区别

构造函数与普通函数的区别在于调用的方式不同,任何函数,只要通过new操作符来调用,那它就可以作为构造函数。

缺点

使用构造函数的主要问题是,每个方法都要在每个实例上重新创建一遍。

扩展阅读:javascript学习总结(五)原型和原型链详解

全局对象

事实上,程序所在的宿主环境一般都会为其提供一个全局对象,而所谓的全局变量其实都只不过是该对象的属性罢了。

例如,当程序所在的宿主环境是web浏览器时,它所提供的全局对象就是window了。

内建对象

内建对象大致分为三组:

  • 数据封装类对象——包括Object、Array、Boolean、Number和String。这些对象代表着javascript中不同的数据类型,并且都拥有各自不同的typeof返回值,以及undefinednull状态
  • 工具类对象——包括Math、Date、RegExp等用于提供遍历的对象
  • 错误类对象——包括一般性错误对象及其它各种更特殊的错误类对象

Object是js中所有对象的父级对象,这意味着我们创建的所有对象都继承于此。

所谓的空对象实际上并不是完全无用的,它还是包含了一些属性和方法的:

  • 返回构造器函数的构造器属性
  • 返回对象描述字符串的toString()方法
  • 返回对象单值描述信息的valueOf()方法

例如:

  1. var o = new Object();
  2. o.toString();//[object Object]

Array

Array()是一个用来构建数组的内建构造器函数。数组主要由如下三种创建方式:

  1. array = new Array()
  2. array = new Array([size])
  3. array = new Array(element0, element1, ..., elementN)

  1. Array 对象方法
  2. 方法 描述
  3. concat() 连接两个或更多的数组,并返回结果。
  4. join() 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。
  5. pop() 删除并返回数组的最后一个元素
  6. push() 向数组的末尾添加一个或更多元素,并返回新的长度。
  7. reverse() 颠倒数组中元素的顺序。
  8. shift() 删除并返回数组的第一个元素
  9. slice() 从某个已有的数组返回选定的元素
  10. sort() 对数组的元素进行排序
  11. splice() 删除元素,并向数组添加新元素。
  12. toSource() 返回该对象的源代码。
  13. toString() 把数组转换为字符串,并返回结果。
  14. toLocaleString() 把数组转换为本地数组,并返回结果。
  15. unshift() 向数组的开头添加一个或更多元素,并返回新的长度。
  16. valueOf() 返回数组对象的原始值

concat()方法:合并数组

  1. [1,2]concat([3,4],[5,6]);//[1,2,3,4,5,6]

join()方法:

  1. <script type="text/javascript">
  2. var a = [1,2,3];
  3. a.join("");// =>"123"
  4. </script>

pop()方法:移除数组最后一个元素,并将其返回

  1. <script type="text/javascript">
  2. var fruits = ['apple','banana','pineapple'];
  3. fruits.pop();// pineapple
  4. console.log(fruits);//["apple","banana"]
  5. </script>

shift()方法:删除并返回数组的第一个元素。

  1. <script type="text/javascript">
  2. var a = [1,2,3];
  3. a.shift();//1
  4. console.log(a);//[2,3]
  5. </script>

slice(start,end)方法:截取数组的某一部分,不会对原数组进行任何修改

  1. <script type="text/javascript">
  2. var num = ['a','b','c','d','e'];
  3. console.log(num.slice(1,4));//["b","c","d"]
  4. console.log(num);//["a","b","c","d","e"]
  5. </script>

splice(start,delete_count,i1,i2…)方法:删除数组元素的同时添加新的元素。i1,i2为要插入的新元素

  1. <script type="text/javascript">
  2. var arr = ['js','css','html','php','c'];
  3. arr.splice(1, 2,'python','jquery');//["css","html"]
  4. console.log(arr);//["js","python","jquery""php","c"]
  5. </script>
  6. 另一个参考网址面向对象,比我这个更容易理解:https://www.ibm.com/developerworks/cn/web/1304_zengyz_jsoo/

js面向对象--由浅入深的更多相关文章

  1. js面向对象设计之function类

    本文仅探讨如何合理的使用 function 在 javascript中实现一个面向对象设计的类.总所周知,javascript 并不能实现一个真正意义上的类,比如 protect 比如 函数重载.下面 ...

  2. js面向对象学习 - 对象概念及创建对象

    原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...

  3. 带你一分钟理解闭包--js面向对象编程

    上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...

  4. JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  5. JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  6. JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  7. js面向对象的实现(example 二)

    //这个方法和上篇文章(js面向对象的实现(example 一))中的方法类似,但是更为简洁 //通过函数赋值的方式来构造对象 //同样通过闭包的方式来封装对象及内部变量 (function () { ...

  8. 浅谈JS面向对象之创建对象

    hello,everybody,今天要探讨的问题是JS面向对象,其实面向对象呢呢,一般是在大型项目上会采用,不过了解它对我们理解JS语言有很大的意义. 首先什么是面向对象编程(oop),就是用对象的思 ...

  9. js面向对象,有利于复用

    需求:在网页上添加个天气预报. 以前总是在需要执行js的地方,直接写function(){}.在需要同样功能的地方直接copy,或者稍微修改. 然后在网上看看有没有好点的方法,然后就看到js面向对象编 ...

随机推荐

  1. advanceInstaller安装文件的ICON

    修改以下配置 点击icon图标位置可重新选择

  2. Vue 组件封装发布到npm 报错 Uncaught TypeError: Cannot read property 'toLowerCase' of undefined

    Uncaught TypeError: Cannot read property 'toLowerCase' of undefined 原因是 没有导出 export default { name:& ...

  3. NuxtJS实战,一个博客系统

    前言 这个项目诞生于17年5月,距今已有两年多了,在这两年期间经历了很多变更,从简单到复杂,又从复杂到简单,并且以后一直会保持这种简单状态.最近迎来了一次更新,因此特意分享一下.虽然只有我一个人使用( ...

  4. 【剑指offer】数组在排序数组中出现的次数

    题目描述 统计一个数字在排序数组中出现的次数. 分析:数组有序,采用二分查找无疑 两种方法,时间复杂度差不多,都是利用二分查找,不过统计k出现的次数有所不同而已 方法1:二分查找k,找到任意一个k的下 ...

  5. Spring 通过@Import实现Bean的注册

    今天看到一个神奇的用法, Spring可以通过@Import导入实现了ImportBeanDefinitionRegistrar接口的类来注册那个类. ImportBeanDefinitionRegi ...

  6. 宝塔linux定时任务设置

    选择shell脚本选择执行周期在脚本内容内写入 curl -sS --connect-timeout 10 -m 60 '此处为地址链接';如下图所示:  

  7. 复制Linux虚拟机(VMware vSphere Client 工具)

    1.VMware vSphere Client 工具 登录,如下图          IP.用户名/密码均是物理机,登录完成界面: 2.选择一个复制的原虚拟机 A,点击左上角[文件]——导出——导出O ...

  8. CentOS7 安装 Docker、最佳Docker学习文档

    目录 一.Docker支持 二.安装Docker -1.在新主机上首次安装Docker CE之前,需要设置Docker存储库.之后,就可以从存储库安装和更新Docker. 0.卸载旧版 1.正式安装 ...

  9. ELK学习笔记之logstash配置多入多出并互相隔离

    0x00 概述 需求:需要利用同一logstash进程采集不同日志,输出到es的不同index,各输入输出隔离: 主要需要解决如下两个问题: 0x01 如何加载多个配置文件 普通启动方式: nohup ...

  10. .net Dapper 学习系列(2) ---Dapper进阶

    目录 写在前面 前期准备 Dapper 单表批量添加 在Dapper 多表查询 在Dapper 调用存储过程 在Dapper 使用QueryMultiple进行多表查询 在Dapper 使用事务进行多 ...