学习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代码
Apr 02 Javascript
dojo学习第一天 Tab选项卡 实现
Aug 28 Javascript
原生javascript兼容性测试实例
Jul 01 Javascript
Asp.Net alert弹出提示信息的几种方法总结
Jan 29 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
Oct 29 Javascript
jquery对所有input type=text的控件赋值实现方法
Dec 02 Javascript
js实现开启密码大写提示
Dec 21 Javascript
JavaScript在控件上添加倒计时功能的实现代码
Jul 04 Javascript
小程序兼容安卓和IOS数据处理问题及坑
Sep 18 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
Nov 22 Javascript
微信小程序时间选择插件使用详解
Dec 28 Javascript
vue实现压缩图片预览并上传功能(promise封装)
Jan 10 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扩展介绍与开发教程
2010/08/19 PHP
PHP执行批量mysql语句的解决方法
2013/05/02 PHP
php微信公众开发之获取周边酒店信息的方法
2014/12/22 PHP
php计算到指定日期还有多少天的方法
2015/04/14 PHP
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
2017/07/10 PHP
在Laravel的Model层做数据缓存的实现
2019/09/26 PHP
JS中令人发指的valueOf方法介绍
2013/02/22 Javascript
使用javascipt---实现二分查找法
2013/04/10 Javascript
谈谈JavaScript自定义回调函数
2015/10/18 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
Angular2中Bootstrap界面库ng-bootstrap详解
2016/10/18 Javascript
JS回调函数基本定义与用法实例分析
2017/05/24 Javascript
实例讲解DataTables固定表格宽度(设置横向滚动条)
2017/07/11 Javascript
JS一个简单的注册页面实例
2017/09/05 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
JS正则表达式封装与使用操作示例
2019/05/15 Javascript
微信小程序实现收货地址左滑删除
2020/11/18 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
python提取字典key列表的方法
2015/07/11 Python
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
Python算法中的时间复杂度问题
2019/11/19 Python
django框架forms组件用法实例详解
2019/12/10 Python
安德玛加拿大官网:Under Armour加拿大
2019/10/02 全球购物
班主任工作年限证明
2014/01/12 职场文书
运动会广播稿60字
2014/01/15 职场文书
党风廉政承诺书
2014/03/27 职场文书
公司任命书模板
2014/06/06 职场文书
校园安全广播稿范文
2014/09/25 职场文书
党员批评与自我批评发言
2014/10/02 职场文书
应届毕业生求职简历自我评价
2015/03/02 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
单位同意报考证明
2015/06/17 职场文书
python文件目录操作之os模块
2021/05/08 Python
教你使用vscode 搭建react-native开发环境
2021/07/07 Javascript
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
2022/04/19 Java/Android