学习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 相关文章推荐
js 判断checkbox是否选中的实现代码
Nov 23 Javascript
基于JQuery的抓取博客园首页RSS的代码
Dec 01 Javascript
Javascript selection的兼容性写法介绍
Dec 20 Javascript
由浅入深讲解Javascript继承机制与simple-inheritance源码分析
Dec 13 Javascript
JS获取字符串实际长度(包含汉字)的简单方法
Aug 11 Javascript
js与jquery分别实现tab标签页功能的方法
Nov 18 Javascript
浅述Javascript的外部对象
Dec 07 Javascript
echarts鼠标覆盖高亮显示节点及关系名称详解
Mar 17 Javascript
一次Webpack配置文件的分离实战记录
Nov 30 Javascript
JS实现利用闭包判断Dom元素和滚动条的方向示例
Aug 26 Javascript
在Vue中使用Select选择器拼接label的操作
Oct 22 Javascript
js 数组 fill() 填充方法
Nov 02 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+oracle 分页类
2006/10/09 PHP
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
2011/12/05 PHP
PHP获取表单所有复选框的值的方法
2014/08/28 PHP
php中in_array函数用法分析
2014/11/15 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
2015/12/30 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
2016/05/13 PHP
php使用curl实现简单模拟提交表单功能
2017/05/15 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
更正确的asp冒泡排序
2007/05/24 Javascript
中文字符串截取的js函数代码
2013/04/17 Javascript
jQuery实现模拟marquee标签效果
2015/07/14 Javascript
小巧强大的jquery layer弹窗弹层插件
2015/12/06 Javascript
javascript的理解及经典案例分析
2016/05/20 Javascript
html+js+highcharts绘制圆饼图表的简单实例
2016/08/04 Javascript
VueJs 搭建Axios接口请求工具
2017/11/20 Javascript
微信小程序中限制激励式视频广告位显示次数(实现思路)
2019/12/06 Javascript
python多线程操作实例
2014/11/21 Python
Python爬虫抓取代理IP并检验可用性的实例
2018/05/07 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
2018/12/24 Python
python 实现在tkinter中动态显示label图片的方法
2019/06/13 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
css3 利用transform打造走动的2D时钟
2020/10/20 HTML / CSS
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
意大利折扣和优惠券网站:Groupalia
2019/10/09 全球购物
C++:memset ,memcpy和strcpy的根本区别
2013/04/27 面试题
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
vue项目实现分页效果
2021/03/24 Vue.js
校园门卫岗位职责
2013/12/09 职场文书
职业女性的职业规划
2014/03/04 职场文书
大学生两会学习心得体会
2014/03/10 职场文书
村委会贫困证明范本
2014/09/17 职场文书
校本课程教学计划
2015/01/19 职场文书
学习雷锋精神倡议书
2015/04/27 职场文书
公司管理建议书
2015/09/14 职场文书
小学毕业教师寄语
2019/06/21 职场文书
python requests模块的使用示例
2021/04/07 Python