浅谈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 ...
随机推荐
- RabbitMQ安装步骤
给centos安装epel yum 源 # rpm -ivh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.r ...
- OpenCASCADE 参数曲线曲面面积
OpenCASCADE 参数曲线曲面面积 eryar@163.com Abstract. 本文介绍了参数曲面的第一基本公式,并应用曲面的第一基本公式,结合OpenCASCADE中计算多重积分的类,对任 ...
- Linux中nginx手动安装
本分类下有一个环境一键安装.那这背后发生了什么呢?咱们手动使用源码进行安装. 1.首先保证有一个能联网的centos. 2.百度 ningx 官网 点download http://nginx. ...
- 基于TCP协议的socket编程
什么是socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面, ...
- keepalived结合nginx实现nginx高可用
1.简介 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障.一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台 ...
- Spring Cloud Zuul 添加 ZuulFilter
紧接着上篇随笔Spring Cloud Zuul写,添加过滤器,进行权限验证 1.添加过滤器 package com.dzpykj.filter; import java.io.IOException ...
- Swagger服务API治理详解
swager2的简介 在App后端开发中经常需要对移动客户端(Android.iOS)提供RESTful API接口,在后期版本快速迭代的过程中,修改接口实现的时候都必须同步修改接口文档,而文档与代码 ...
- ExtJs 带参数的MVC
题记:研究使用ext两个星期了,从痛苦中逐渐走向明朗. 展示列表的子列表的数据时需要将当前的数据传给下一个mvc. 比如用户列表,点击一个用户查看该用户的日志列表. 首先是controller,放一个 ...
- Java开发小技巧(三):Maven多工程依赖项目
前言 本篇文章基于Java开发小技巧(二):自定义Maven依赖中创建的父工程project-monitor实现,运用我们自定义的依赖包进行多工程依赖项目的开发. 下面以多可执行Jar包项目的开发为例 ...
- Java---Ajax在Struts2框架的应用实例
Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 很久没有动过ajax了,趁此机会复习一下,写一个简单的例子 一.项目结构: 二.需要的jar包 三.具体代码: 1.web.x ...