javascript学习之对象基础
2019独角兽企业重金招聘Python工程师标准>>>
javascript学习之对象基础
面向对象语言
面向对象语言需要向开发者提供四种基本能力
- 封装:把相关信息(数据和方法)存储在对象中的能力。
- 聚集:把一个对象存储在另外一个对象内的能力。
- 继承:由另外一个类或者多个类来得到类的属性和方法的能力。
- 多态:编写能够以多种方式运行的函数或者方法的能力。
对象的构成
在ECMAScript中,对象由特性attribute构成的,特性可以是原始值,也可以是引用值。
如果特性存在的是函数,它将被看作对象的方法method,否则该特性被看作属性property。
对象应用
声明和实例化
对象是用关键字new后面跟着要实例化的类的名字创建的:
var object = new Object();
PS:创建了Object类的一个实例,并把这个实例存储在变量object中。
如果构造函数没有参数,括号则不是必须的
var object = new Object;
对象引用
在ECMAScript中,不能访问对象的物理表示,只能访问对象的引用,所以每次创建对象,存储在变量中的都是该对象的引用,而不是对象本身。
对象废除
由于ECMAScript是无用存储单元收集程序,意味着不必专门消耗对象来释放内存。当再没有对对象的引用时候,称为该对象被废除dereference了。
方式:把对象的所有引用都设置成null,可以强制性的废除对象。
var object = new Object;
// do something with the object here
object = null;
PS: 废除对象的所有引用的时候需要小心,如果一个对象有两个或者更多的引用,则要正确的废除该对象,必须将其所有引用都设置成null.
早绑定和晚绑定
所谓绑定binding,即把对象的接口与对象实例结合在一起的方法。
早绑定 early binding 指的是实例化对象之前定义他的特性和方法,这样编译器或者解释程序就能提前转换机器语言。像java这样的语言就是早绑定。而ECMAScript不是强类型语言,所以不支持早绑定。
晚绑定 late binding 使用晚绑定,无需检查对象的类型,只需要检查对象是否支持特性和方法即可。ECMAScript中的所有变量都是采用晚绑定方法。
对象类型
本地对象
所谓本地对象native object:独立于宿主环境的ECMAScript实现提供的对象。
Object/Function/Array/String/Boolean/Number/Date/RegExp/Error/EvalError/RangeError/ReferenceError/SyntaxError/TypeError/UrlError
内置对象
所谓内置对象built-in object ,由ECMAScript实现提供的,独立于宿主环境的所有变量,在ECMAScript程序开始执行时出现。
Global对象
Global对象是ECMAScript中最特别的对象,因为实际上它根本不存在。
这里需要理解的是:在ECMAScript中,不存在独立的函数,所有函数都必须是某个对象的方法。
所以像isNaN(),isFinite(),parseInt(),parseFloat()方法都是Global对象的方法。
小结Global对象的方法:
encodeURI()/encodeURIComponent()/decodeURI()/decodeURIComponent()/eval()/isNaN()/isFinite()/parseInt()/parseFloat()
Math对象
Math对象提供了很多方法用于计算。这里先略了。有机会详细的拉出一节来总结。
宿主对象
所有非本地对象都是宿主对象host object,所有DOM和BOM都是宿主对象。
作用域
公用、受保护和私有作用域
对于公用和受保护,私有作用域对于ECMAScript都是没有意义的,因为在ECMAScript中只存在一种作用域-公用作用域。在ECMAScript中所有对象的所有属性和方法都是公用的。
网上人的建议对象私有作用域使用下划线来定义:
obj._color = 'red';
静态作用域并非静态的
在java中类是可以拥有静态属性和方法的,无需在实例化该类的对象,既可以访问这些属性和方法。
严格的来说,ECMAScript中是没有静态作用域的,不过可以给构造函数提供属性和方法
PS:构造函数只是函数,函数是对象,对象可以拥有属性和方法的。
关键字this
对于关键字this:总是指向调用该方法的对象。
定义类和方法
使用预定义对象的能力只是面向对象语言的能力的一部分,它真正强大之处在于能够创建自己专用的类和对象。
工厂方式
/** 工厂方式* */
function createCar(color, size, mpg) {var oTempCar = {};oTempCar.color = color;oTempCar.size = size;oTempCar.mpg = mpg;oTempCar.getColor = function () {console.log(this.color);}return oTempCar;
}var oCar1 = createCar('red', 21, 33);
var oCar2 = createCar('blue', 11, 44);
oCar1.getColor();
oCar2.getColor();
构造函数方式
/** 构造函数方式* */
function Car(color, size, mpg) {this.color = color;this.size = size;this.mpg = mpg;this.getColor = function () {console.log(this.color);}
}var oCar3 = new Car('green', 33, 22);
var oCar4 = new Car('white', 44, 66);
oCar3.getColor();
oCar4.getColor();
原型方式
/** 原型方式* */function newCar() {}newCar.prototype.color = 'orange';
newCar.prototype.size = 22;
newCar.prototype.mpg = 32;
newCar.prototype.getColor = function () {console.log(this.color);
}var oCar5 = new newCar();
oCar5.getColor();
console.log(oCar5 instanceof newCar);
混合的构造函数/原型方式
/** 混合的构造函数/原型方式** 用构造函数定义对象的所有非函数属性。* 用原型方式定义对象的函数属性(方法)* */function newCar2(color, size, mpg) {this.color = color;this.size = size;this.mpg = mpg;
}newCar2.prototype.getColor = function () {console.log(this.color);
}var oCar6 = new newCar2('black', 22, 99);
oCar6.getColor();
动态原型方式
略,不建议使用
混合工厂方式
略,不建议使用
修改对象
对于属性prototype,每个构造函数都有prototype属性,可以用于定于方法。
创建新的方法
使用prototype属性为任何已有的类定义新的方法。
/*
输出十六进制的字符串
*/String.prototype.toHexString = function(){return this.toString(16);
}
重定义已有方法
使用属性prototype同样可以覆盖已有的方法。
Function.prototype.toString = function(){return 'Function code hidden';
}
转载于:https://my.oschina.net/bosscheng/blog/159957
javascript学习之对象基础相关推荐
- JavaScript学习笔记——对象知识点
javascript对象的遍历.内存分布和封装特性 一.javascript对象遍历 1.javascript属性访问 对象.属性 对象[属性] //字符串格式 //javascript属性的访问方法 ...
- Javascript学习总结 - JS基础系列 二
简述 本系列将持续更新Javascript基础部分的知识,谁都想掌握高端大气的技术,但是我觉得没有一个扎实的基础,我认为一切高阶技术对我来讲都是过眼云烟,要成为一名及格的前端工程师,必须把基础打扎实了 ...
- 1. JavaScript学习笔记——JS基础
1. JavaScript基础 1.1 语法 严格区分大小写 标识符,第一个字符可以是 $,建议使用小驼峰法, 保留字.关键字.true.false.null不能作为标识符 JavaScript是用U ...
- Javascript学习总结 - JS基础系列三
简述 本系列将持续更新Javascript基础部分的知识,谁都想掌握高端大气的技术,但是我觉得没有一个扎实的基础,我认为一切高阶技术对我来讲都是过眼云烟,要成为一名及格的前端工程师,必须把基础打扎实了 ...
- JavaScript学习之对象
将自定义对象和用内置对象初始化一个变量,使变量成为对象实践了一下: 不懂将代码表框,只好这么写... 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD ...
- 廖雪峰JavaScript学习笔记(基础及数据类型、变量)
先睹为快 alert('我要学JavaScript!'); Run: 基本语法: 1.每个语句以;结束,不强制 2.语句块用{...} 3.//单行注释,/*...*/ 多行注释 数据类型: 1.不区 ...
- javascript学习----window对象的学习与总结
一 BOM:浏览器对象模型,提供了很多对象,用于对浏览器的功能进行访问,浏览器本身自己就有一些对象,不需要创建. BOM的核心对象是window,它是浏览器的一个实例. 二.(1)Window:的 ...
- JavaScript学习笔记——JS基础0
JavaScript的起源: JavaScript诞生于1995年,它的出现主要是用于处理网页中的前端验证.所谓的前端验证,就是指检查用户输入的内容是否符合一定的规则.比如:用户名的长度,密码的长度, ...
- JavaScript学习笔记——对象和数组(上)
/** 对象:其实就是一种类型,即引用类型.以下学习的是Object类型,Array类型,以及其方法.* 对象的值就是引用类型的一个实例.如:水果作为一个对象,香蕉就是水果对象中的一个实例.男生是一个 ...
最新文章
- RapidFramework使用Oracle的步骤
- java使用原始套接字技术进行数据包截获_Linux零拷贝技术,看完这篇文章就懂了...
- 【Windows 逆向】CheatEngine 工具 ( CheatEngine 简介 | 使用 Lazarus 编译 CE 源码 | CheatEngine 相关文档资料 )
- 【不采用】人工智能如何帮助银行反欺诈
- Visual Translation Embedding Network for Visual Relation Detection论文中的术语以及对论文的理解笔记...
- sql_1-2_get基于盲注
- docker-compose 使用小例
- 波卡生态HydraDX将于2月8日通过Balancer发售5亿枚代币
- Java-斗地主小游戏洗牌发牌(控制台程序)
- Delphi7调用百度API
- 【个人笔记】图解深度学习
- UE4 C++无法打开包括文件	C1083
- 应聘引擎程序需做哪些准备
- HtmlParser初步研究
- 网站灰色代码|哀悼日专用
- 傻子都能看懂的 财务报表入门
- 【C++】DFS——计算土地上水洼的数量
- android 记录触屏坐标,android 屏幕坐标总结
- 论文阅读笔记- Dremel
- 服务器raid1怎么重装系统,win7 raid1重装系统图文教程
热门文章
- java aqua和metal_Java工具集介绍9_16
- java返回datatable_(转)在JAVA实现DataTable对象(三)——DataTable对象实现
- 面向对象方法的优势简化软件开发的过程_Java面试题说一说你的对面向过程和面向对象的理解...
- oracle下的inventory文件夹,oracle INVENTORY 详解
- Spark基础学习笔记23:DataFrame与Dataset
- 无心剑中译丁尼生《乞丐少女》
- 【codevs1021】玛丽卡,以前屯着的最短路
- 【codevs1074】食物链
- 2017.3.15 余数之和sum 失败总结
- mysql 状态机_动画状态机(2)