学习javascript面向对象 理解javascript对象


Posted in Javascript onJanuary 04, 2016

一、编程思想
面向过程:以过程为中心,自顶向下逐步细化,程序看成一系列函数调用的集合
面向对象:对象作为程序的基本单元,程序分解为数据和相关操作
二、类、对象
类:对具有相同特性和特征事物的抽象描述
对象:某种类型对应的具体事物
三、面向对象的三大特性
封装:隐藏实现细节,实现代码模块化
继承:扩展已存在的代码模块,实现代码重用 
多态:接口的不同实现方式,实现接口重用
四、对象定义:无序属性的集合,其属性可以包含基本值、对象或者函数

//简单的对象实例
var person = new Object();
  person.name = "Nicholas";
  person.age = 29;
  person.job = "Software Engineer";
  person.sayName = function(){
    alert(this.name);
  }

五、内部属性类型:内部属性无法直接访问,ECMAScript5把它们放在两对方括号中,分为数据属性和访问器属性
[1]数据属性包含一个数据值的位置,在这个位置可以读取和写入值。数据属性有4个特性:

a、[[Configurable]]: 表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性,直接在对象上定义的属性,默认值为true

b、[[Enumerable]]: 表示能否通过for-in循环返回属性,直接在对象上定义的属性,默认值为true

c、[[Writable]]: 表示能否修改属性的值,直接在对象上定义的属性,默认值为true

d、[[Value]]: 包含这个属性的数据值,读取属性值的时候,从这个位置读;写入属性值的时候,把新值保存在这个位置。直接在对象上定义的属性,默认值为undefined
[2]访问器属性不包含数据值,包含一对getter和setter函数(不过这两个函数不是必需的)。读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;在写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如何处理函数。访问器属性有如下4个特性:

a、[[Configurable]]: 表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。直接在对象上定义的属性,默认值为true

b、[[Enumerable]]: 表示能否通过for-in循环返回属性,直接在对象上定义的属性,默认值为true

c、[[Get]]: 在读取属性时调用的函数。默认值为undefined

d、[[Set]]: 在写入属性时调用的函数。默认值为undefined
六、修改内部属性:使用ECMAScript5的object.defineProperty()方法,该方法接收三个参数:属性所在的对象、属性的名字和一个描述符对象
  [注意1]IE8是第一个实现Object.defineProperty()方法的浏览器版本。然而,这个版本的实现存在诸多限制:只能在DOM对象上使用这个方法,而且只能创建访问器属性。由于实现不彻底,不建议在IE8中使用Object.defineProperty()方法
  [注意2]不支持Object.defineProperty()方法的浏览器中不能修改[[Configurable]]和[[Enumerable]]
[1]修改数据属性

//直接在对象上定义的属性,Configurable、Enumerable、Writable为true
var person = {
  name:'cook'
};
Object.defineProperty(person,'name',{
  value: 'Nicholas'
});
alert(person.name);//'Nicholas'
person.name = 'Greg';
alert(person.name);//'Greg'
//不是在对象上定义的属性,Configurable、Enumerable、Writable为false
var person = {};
Object.defineProperty(person,'name',{
  value: 'Nicholas'
});
alert(person.name);//'Nicholas'
person.name = 'Greg';
alert(person.name);//'Nicholas'
//该例子中设置writable为false,则属性值无法被修改
var person = {};
Object.defineProperty(person,'name',{
  writable: false,
  value: 'Nicholas'
});
alert(person.name);//'Nicholas'
person.name = 'Greg';
alert(person.name);//'Nicholas'
//该例子中设置configurable为false,则属性不可配置
var person = {};
Object.defineProperty(person,'name',{
  configurable: false,
  value: 'Nicholas'
});
alert(person.name);//'Nichols'
delete person.name;
alert(person.name);//'Nicholas'

[注意]一旦把属性定义为不可配置的,就不能再把它变回可配置了,也就是说可以多次调用Object.defineProperty()修改同一属性,但在把configurable设置为false之后,就有限制了

var person = {};
Object.defineProperty(person,'name',{
  configurable: false,
  value: 'Nicholas'
});
//会报错
Object.defineProperty(person,'name',{
  configurable: true,
  value: 'Nicholas'
});

[2]修改访问器属性

//简单的修改访问器属性的例子
var book = {
  _year: 2004,
  edition: 1
};
Object.defineProperty(book,'year',{
  get: function(){
    return this._year;
},
  set: function(newValue){
    if(newValue > 2004){
      this._year = newValue;
      this.edition += newValue - 2004;
    }
  }
});
book.year = 2005;
alert(book.year)//2005
alert(book.edition);//2

[注意1]只指定getter意味着属性是不能写

var book = {
  _year: 2004,
  edition: 1
};
Object.defineProperty(book,'year',{
  get: function(){
    return this._year;
  },
});
book.year = 2005;
alert(book.year)//2004

[注意2]只指定setter意味着属性不能读

var book = {
  _year: 2004,
  edition: 1
};
Object.defineProperty(book,'year',{
  set: function(newValue){
    if(newValue > 2004){
      this._year = newValue;
      this.edition += newValue - 2004;
    }
  }
});
book.year = 2005;
alert(book.year);//undefined

【补充】创建访问器属性的用两个非标准的方法:__defineGetter__()和__defineSetter__()

var book = {
  _year: 2004,
  edition: 1
};
//定义访问器的旧有方法
book.__defineGetter__('year',function(){
  return this._year;
});
book.__defineSetter__('year',function(newValue){
  if(newValue > 2004){
    this._year = newValue;
    this.edition += newValue - 2004;
  }
});
book.year = 2005;
alert(book.year);//2005
alert(book.edition);//2

七、定义多个属性:ECMAScript5定义了一个Object.defineProperties()方法,利用这个方法可以通过描述符一次定义多个属性,这个方法接收两个对象参数:第一个对象是要添加和修改其属性的对象,第二个对象的属性与第一个对象要添加或修改的一一对应

var book = {};
Object.defineProperties(book,{
  _year: {
    value: 2004
  },
  edition: {
    value: 1
  },
  year: {
    get: function(){
      return this._year;
    },
    set: function(newValue){
      if(newValue > 2004){
        this._year = newValue;
        this.edition += newValue - 2004;
      }
    }
  }
});

八、读取属性特性:使用ECMAScript5的Object.getOwnPropertyDescriptor()方法,可以取得给定属性的描述符。该方法接收两个参数:属性所在对象和要读取其描述符的属性名称,返回值是一个对象。
[注意]可以针对任何对象——包括DOM和BOM对象,使用Object.getOwnPropertyDescriptor()方法

var book = {};
Object.defineProperties(book,{
  _year: {
    value: 2004
  },
  edition: {
    value: 1
  },
  year: {
    get: function(){
      return this._year;
    },
    set: function(newValue){
      if(newValue > 2004){
        this._year = newValue;
        this.edition += newValue - 2004;
      }
    }
  } 
});
var descriptor = Object.getOwnPropertyDescriptor(book,'_year');
alert(descriptor.value);//2004
alert(descriptor.configurable);//false
alert(typeof descriptor.get);//'undefined'

var descriptor = Object.getOwnPropertyDescriptor(book,'year');
alert(descriptor.value);//'undefined'
alert(descriptor.configurable);//false
alert(typeof descriptor.get);//'function'

以上就是关于javascript面向对象的详细内容介绍,希望对大家的学习有所帮助。

Javascript 相关文章推荐
JQuery的Alert消息框插件使用介绍
Oct 09 Javascript
jquery ajax跨域解决方法(json方式)
Feb 04 Javascript
jQuery插件datepicker 日期连续选择
Jun 12 Javascript
js实现全国省份城市级联下拉菜单效果代码
Sep 07 Javascript
jquery对象访问是什么及使用方法介绍
May 03 Javascript
js实现StringBuffer的简单实例
Sep 02 Javascript
vuejs在解析时出现闪烁的原因及防止闪烁的方法
Sep 19 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
Nov 16 Javascript
AngularJS全局scope与Isolate scope通信用法示例
Nov 22 Javascript
JS基于对象的链表实现与使用方法示例
Jan 31 Javascript
Javascript实现鼠标点击冒泡特效
Dec 24 Javascript
antd-mobile ListView长列表的数据更新遇到的坑
Apr 08 Javascript
基于JavaScript实现移除(删除)数组中指定元素
Jan 04 #Javascript
实例代码详解javascript实现窗口抖动及qq窗口抖动
Jan 04 #Javascript
javascript基础语法学习笔记
Jan 04 #Javascript
封装好的javascript前端分页插件pagination
Jan 04 #Javascript
详解javascript的变量与标识符
Jan 04 #Javascript
bootstrap实现弹窗和拖动效果
Jan 03 #Javascript
基于javascript实现窗口抖动效果
Jan 03 #Javascript
You might like
php 文件状态缓存带来的问题
2008/12/14 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
用正则xmlHttp实现的偷(转)
2007/01/22 Javascript
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
2010/06/25 Javascript
给jQuery方法添加回调函数一款插件的应用
2013/01/21 Javascript
使用jQuery和PHP实现类似360功能开关效果
2014/02/12 Javascript
JavaScript中的console.trace()函数介绍
2014/12/29 Javascript
JS两个数组比较,删除重复值的巧妙方法(推荐)
2016/06/03 Javascript
JS绘制微信小程序画布时钟
2016/12/24 Javascript
Angular2+国际化方案(ngx-translate)的示例代码
2017/08/23 Javascript
使用jQuery实现页面定时弹出广告效果
2017/08/24 jQuery
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
jQuery位置选择器用法实例分析
2019/06/28 jQuery
使用nodejs实现JSON文件自动转Excel的工具(推荐)
2020/06/24 NodeJs
[00:32]2018DOTA2亚洲邀请赛Mineski出场
2018/04/04 DOTA
Python框架Flask的基本数据库操作方法分析
2018/07/13 Python
在Python中获取两数相除的商和余数方法
2018/11/10 Python
对pyqt5之menu和action的使用详解
2019/06/20 Python
详解python中__name__的意义以及作用
2019/08/07 Python
Python 70行代码实现简单算式计算器解析
2019/08/30 Python
python安装scipy的步骤解析
2019/09/28 Python
Python远程开发环境部署与调试过程图解
2019/12/09 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
2020/01/25 Python
Python守护进程实现过程详解
2020/02/10 Python
django实现HttpResponse返回json数据为中文
2020/03/27 Python
python中pickle模块浅析
2020/12/29 Python
解释一下钝化(Swap out)
2016/12/26 面试题
线程问题:wait()方法是定义在哪个类里面
2015/07/07 面试题
网络工程专业毕业生推荐信
2013/10/28 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书
2015年社区工会工作总结
2015/05/26 职场文书
安全生产学习心得体会
2016/01/18 职场文书
你会写报告?产品体验报告到底该怎么写?
2019/08/14 职场文书
goland 恢复已更改文件的操作
2021/04/28 Golang
MySQL 时间类型的选择
2021/06/05 MySQL
mysql 索引的数据结构为什么要采用B+树
2022/04/26 MySQL