浅谈JavaScript的面向对象程序设计(一)
面向对象的语言有一个标志,他们都有类的概念,通过类可以创建多个具有相同属性和方法的对象。但是JavaScript中没有类的概念,因此JavaScript与其他的面向对象语言还是有一定区别的。JavaScript把对象定义为无序属性的集合,其属性可以包含基本值、对象或者函数。对象的每个属性或者方法都有一个名字,而每个名字都映射到一个值。所有我把JavaScript的对象看成一组无序的键值对。
对象是什么
以前曾介绍过对象的创建,建立对象最简单的方式就是建立Object对象的一个实例,再为他添加属性和方法。
var obj = new Object();
obj.name="test";
obj.getName=function(){
return this.name;
}
console.log(obj.getName());
上面的代码第一行创建了一个对象obj,第二行给obj添加了属性name,第三行给obj添加了方法getName。通过getName方法能够获取obj属性name的值。第六行输出字符串test。
var obj = {};
obj.name="test";
obj.getName=function(){
return this.name;
}
console.log(obj.getName());
上面的代码通过字面量创建了对象obj。其他与通过Object创建的完全一样。
对象的属性
JavaScript有两种属性:数据属性和访问器属性。
- 数据属性
数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有4个描述其行为的特性。
Configurable:表示能否通过delete关键字删除属性或者把属性修改为访问器属性。configurable默认是true。
Enumerable:表示能否通过for-in循环,默认值为true。
Writable:表示能够修改属性的值,默认为true。
Value:包含这个数据的属性值。读取属性值时,从这个位置读。写入属性值的时候,把新值保存在这个位置。默认为undefined。
对于像前面那样定义对象,他的configurable、enumerable和writable默认都是true,value是指定给它的值。
var obj={
name:"test";
}
这创建的对象obj拥有一个属性,并设置value值为test。要修改默认属性必须使用Object.defineProperty()方法。这个方法接收三个参数:属性所在的对象、属性的名字和描述符。描述符对象的属性必须是configurable、enumerable、writable和value中的一个或者多个。
var obj={
};
Object.defineProperty(obj,"name",{
configurable:true,
value:"hehe",
enumerable:true,
writable:false
});
obj.name="test";
console.log(obj.name);//输出hehe
这个例子创建了一个属性name,并设置wriable为false,也就是说name属性的value将无法写入。所在我在第九行修改name的值,并没有效果。name的值依然为test。
把configurable设置为false之后,该属性就将无法通过delete删除,同时也不能通过Object.defineProperty()方法设置除writable之后的值。在严格模式下,如果调用该方法将会报错。
当通过Object.defineProperty方法定义属性的时候,configurable、enumerable和writable特性的默认值是false。所以,最好不要通过该方法定义属性。
- 访问器属性
访问器属性不包含value,但是包含一对getter和setter函数。在读取访问器属性时,会调用getter函数。在写入访问器属性时,会调用setter函数。访问器属性有以下四个特性:
Configurable:表示能否通过delete关键字删除属性或者把属性修改为访问器属性。configurable默认是true。
Enumerable:表示能否通过for-in循环,默认值为true。
get:在读取属性的时候调用的函数,默认值为undefined。
set:在写入属性的值时调用的函数,默认是undefined。
var person={"_name":"hehe","age":18}
Object.defineProperty(person,"name",{
get:function(){
return this._name;
},
set:function(str){ if(this._name!="haha"){
this._name=str;
this.age="19";
}
}
});
person.name="haha";
console.log(person.name+":"+person.age);//haha:19
上面的代码创建了一个对象person,并定义了两个属性_name和age。_name表示内部属性,一般由对象本身去访问。定义了属性name,有get和set方法。不一定要同时定义get和set方法。只有get方法,则尝试写入属性的时候报报错。只有set方法,则获取属性的时候会报错。通过Object的defineProperties能够同时定义多个属性。
var obj={};
Object.defineProperties(obj,{
name:{
value:"hehe"
},
age:{
value:"18"
}
});
console.log(obj.name+":"+obj.age);//hehe:18
上面的代码,通过Object的defineProperties方法同时定义了两个属性name和age。该方法的第一个参数是对象,第二个参数是由需要定义的属性组成的对象。
- 读取属性的特性
JavaScript提供了Object.getOwnPropertyDescriptor方法,可以获取属性的描述符。这个方法需要两个参数:第一个参数是对象,第二个参数是描述符属性的名称。返回值是一个对象,如果是访问器属性则有configurable、enumerable、writable、get和set。如果是数据属性,这个对象有属性configurable、enumerable、writable和value。
var obj={};
Object.defineProperties(obj,{
name:{
value:"hehe"
},
age:{
value:"18"
},
_sex:{
value:"man"
},
sex:{
get:function(){
return this._sex;
},
set:function(str){
this._sex=str;
}
}
});
var descriptor1=Object.getOwnPropertyDescriptor(obj,"name");
var descriptor2=Object.getOwnPropertyDescriptor(obj,"sex");
console.log(descriptor1.writable);//false
console.log(descriptor2.get);//function
console.log(obj.name+":"+obj.age+","+obj.sex);//hehe:18,man
上面的代码,通过Object.getOwnPropertyDescriptor()方法获取属性的描述吗,分别获取了数据属性以及访问器属性。
浅谈JavaScript的面向对象程序设计(一)的更多相关文章
- 浅谈JavaScript的面向对象程序设计(四)
本文继续讲解JavaScript的面向对象程序设计.继承是面向对象语言中的一个基本概念,面向对象语言支持两种继承实现方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.但是在 ...
- 浅谈JavaScript的面向对象程序设计(三)
前面已经对JavaScript的面向对象程序设计作了简单的介绍,包括了对象的属性.对象的工厂模式.构造函数和原型等.通过介绍,这些创建对象的方法依然有不少优化和改进的地方. 组合使用构造函数模式和原型 ...
- 浅谈JavaScript的面向对象程序设计(二)
前面介绍通过Object构造函数或者字面量创建单个对象,但是通过这个的方法创建对象有明显的缺点:调用同一个接口创建多个实例,会产生大量的重复代码.怎么样解决? 工厂模式 工厂模式是软件工程领域经常使用 ...
- 浅谈JavaScript的面向对象和它的封装、继承、多态
写在前面 既然是浅谈,就不会从原理上深度分析,只是帮助我们更好地理解... 面向对象与面向过程 面向对象和面向过程是两种不同的编程思想,刚开始接触编程的时候,我们大都是从面向过程起步的,毕竟像我一样, ...
- 浅谈javascript的面向对象思想
面向对象的三大基本特性 封装(把相关的信息(无论数据或方法)存储在对象中的能力) 继承(由另一个类(或多个类)得来类的属性和方法的能力) 多态(一个对象在不同情况下的多种形态) 定义类或对象 第一种: ...
- 浅谈JavaScript浮点数及其运算
原文:浅谈JavaScript浮点数及其运算 JavaScript 只有一种数字类型 Number,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的.浮点数的精度问题 ...
- [转载]浅谈JavaScript函数重载
原文地址:浅谈JavaScript函数重载 作者:ChessZhang 上个星期四下午,接到了网易的视频面试(前端实习生第二轮技术面试).面了一个多小时,自我感觉面试得很糟糕的,因为问到的很多问题都 ...
- 浅谈javascript函数节流
浅谈javascript函数节流 什么是函数节流? 函数节流简单的来说就是不想让该函数在很短的时间内连续被调用,比如我们最常见的是窗口缩放的时候,经常会执行一些其他的操作函数,比如发一个ajax请求等 ...
- 浅谈JavaScript中的闭包
浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...
随机推荐
- 自己动手实现mybatis动态sql
发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客.本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧. 用过mybatis的人,估计 ...
- php面试之四-Linux部分
php面试题之四——Linux部分(高级部分) 四.Linux部分 1.请解释下列10个shell命令的用途(新浪网技术部) top.ps.mv.find.df.cat.chmod.chgrp.gre ...
- php结合redis实现秒杀功能
<?php 第一种,简单实现 $conn=mysql_connect("localhost","big","123456"); if( ...
- NodeJS爬虫入门
1. 写在前面 往常都是利用 Python/.NET 语言实现爬虫,然现在作为一名前端开发人员,自然需要熟练 NodeJS.下面利用 NodeJS 语言实现一个糗事百科的爬虫.另外,本文使用的部分代码 ...
- windows添加默认路由
由于GW的原因,我们无法使用强大的google,身为技术屌丝,这是不能容忍的,于是乎使用了VPN,但是VPN连上之后,悲剧发生了,我的服务器连不上了,怎么整 原来一切都是很简单,在windows上添加 ...
- ArcGIS jsAPI (4.x)本地部署字体符号乱码
在下载了新版arcigs 的 JS API 后,每次部署在IIS中都会出现部件字体乱码的问题,需配置响应标头和添加文件映射 一. HTTP响应标头配置 在 IIS 中的 HTTP响应标头 中加入以下配 ...
- Web前端学习——JavaScript
一.JavaScript介绍JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚 ...
- ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理
分布式文档存储 ES分布式特性 屏蔽了分布式系统的复杂性 集群内的原理 垂直扩容和水平扩容 真正的扩容能力是来自于水平扩容–为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中 ES集群特点 ...
- C++技术问题总结-第8篇 STL内存池是怎么实现的
STL内存池机制,使用双层级配置器.第一级採用malloc.free,第二级视情况採用不同策略. 这样的机制从heap中要空间,能够解决内存碎片问题. 1.内存申请流程图 简要流程图例如以下. ...
- NodeJS+Express+MongoDB
一.MongoDB MongoDB是开源,高性能的NoSQL数据库:支持索引.集群.复制和故障转移.各种语言的驱动程序丰富:高伸缩性:MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言 ...