在面向对象语言中都有类的概念,通过类来创建具有属性和方法的对象。而ECMAScript中没有类的概念,ECMAScript中定义了对象:无需属性的集合,其属性值可以包含基本值、对象、或者函数。

在Javascript中每个对象都是基础引用类型来创建的,可以是原生类型也可以是自定义的类型。

自定义对象最简单的方法就是通过创建Object类型的实例,然后为这个实例添加属性和方法。

var Person = new Object();

Person.name = "yangxunwu";

Person.age = 24;

Person.sayName = function(){

alert(this.name);

};

我们这里创建了一个object类型的一个名为Person的对象,有两个属性name和age,一个方法sayName;

属性类型:

对象拥有属性,这些属性也有一些特性,比如Configurable、Enumerable、Writable、Value。在javascript不能直接访问这些特性,需通过对象的方法访问,比如Object.defineProperty()

数据属性:数据属性包含这个数据值的位置,在这个位置可以读取和写入值。数据属性有四个特性:

Configurable:能否通过delete删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为访问器属性。

Enumerable:能否通过for-in循环返回属性。

Writable:能否修改属性值。

Value:保持这个属性的数据值。

var Person = {

name: "yangxunwu",

}

Object.defineProperty(Person, "age", {

writable: false,

value: 24

})

定义一个Person对象,并设置一个不可写的值为24的age属性。注意定义属性时的属性字符串形式。当把属性的configurable特性设置为false时,无法在次修改,只能使用writable。

访问器属性:    访问器属性不包含值,包含一对getter和setter函数,访问访问器属性时调用getter函数,这个函数返回有效的值,写入访问器属性时调用setter函数,并传入新值。访问器属性包含四个特性:

Configurable:能否通过delete删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为数据属性。

Enumerable:能否通过for-in循环返回属性。

Get:读取数据时调用的函数。默认undefined

Set:写入属性时调用的函数。默认undefined

var Person = {

_year : 1992,

}

Object.defineProperty(Person, "year", {

get: function(){

return this._year;

},

set: function(newValue){

if(newValue > 1992){

this._year = newValue;

this.age = newValue - 1992;

}

}

})

给Person对象,定义了一个访问器属性year,访问时返回对象的__year属性,赋值时会调用set函数,然后同时设置age的值。

部分浏览器也可以通过_defineGetter__和 __defineSetter__来设置访问器特性。也可以设置多个特性Object.defineProperties()。要读取一个属性的特性,可以通过给定属性的描述符。

Object.getOwnPropertyDescriptor()方法,返回一个对象,包含各种特性的属性,可以针对BOM和DOM对象来使用。

ECMAScript定义这些特性的目的是为了实现Javascript引擎用的

Javascript高级程序设计——面向对象之理解对象的更多相关文章

  1. JavaScript高级程序设计学习(五)之对象

    众说周知,java是面向对象的编程语言.一个类包含多个对象,例如车类,它包含宝马,奔驰,东风,本田,莲花等这样的车,而品牌和颜色或者某种标识就是它的属性.车包含很多种类,但是共性还是有的,比如共性有四 ...

  2. Javascript高级程序设计——面向对象小结

    ECMAScript支持面向对象编程,对象可以在代码执行时创建,具有动态扩展性而非严格意义上的实体. 创建对象方法: 工厂模式:简单的函数创建引用类型 构造函数模式:可以创建自定义引用类型,可以想创建 ...

  3. 2020/06/06 JavaScript高级程序设计 面向对象的程序设计

    ECMAScript虽然是一种面向对象的语言,但是他没有类的概念.所以他的对象也与其他语言中的对象有所不同. ECMA-262定义对象:一组没有特定顺序的值. 6.1 理解对象 创建对象的方法: 1. ...

  4. Javascript高级程序设计——面向对象之实现继承

    原型链: 构造函数中都有一个prototype属性指针,这个指针指向原型对象,而创建的实例也有指向这个原型对象的指针__proto__.当实例查找方法时先在实例上找,找不到再通过__proto__到原 ...

  5. Javascript高级程序设计——面向对象之创建对象

    对象创建方法: 工厂方法 构造函数模式 原型模式 组合构造函数和原型模式 寄生构造函数模式 问题构造函数模式 工厂模式: function Person(name, age){ var obj = n ...

  6. 《JavaScript高级程序设计》学习笔记(5)——面向对象编程

    欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第六章内容. 1.面向对象(Object ...

  7. 《Javascript高级程序设计》读书笔记之对象创建

    <javascript高级程序设计>读过有两遍了,有些重要内容总是会忘记,写一下读书笔记备忘 创建对象 工厂模式 工厂模式优点:有了封装的概念,解决了创建多个相似对象的问题 缺点:没有解决 ...

  8. 读书时间《JavaScript高级程序设计》二:面向对象

    接着上次的进度,开始看第6章. 第6章 面向对象的程序设计 理解对象 创建自定义对象最简单的方式就是创建一个 Object 的实例,然后为它添加属性和方法. var person = new Obje ...

  9. 《JavaScript高级程序设计(第3版)》阅读总结记录第一章之JavaScript简介

    前言: 为什么会想到把<JavaScript 高级程序设计(第 3 版)>总结记录呢,之前写过一篇博客,研究的轮播效果,后来又去看了<JavaScript 高级程序设计(第3版)&g ...

随机推荐

  1. Unable to execute dex: java.nio.BufferOverflowException.解决办法

    异常提示: [2014-01-16 09:27:35 - Dex Loader] Unable to execute dex: java.nio.BufferOverflowException. Ch ...

  2. 常见linux命令释义(第六天)——shell环境变量

    太懒了,这几天好像得了懒癌,一点都不想写博客.后来想想,知识嘛,还是分享出来的好.第一治自己的懒癌:第二顺便巩固下自己的知识. Linux的变量分为两种,一种是系统变量,是系统一经启动,就写进内存中的 ...

  3. 【项目】iOS - 使用UIWebView占用内存过大

    通过其他博主介绍的解决这个问题的博客: http://blog.techno-barje.fr//post/2010/10/04/UIWebView-secrets-part1-memory-leak ...

  4. linux中运维相关命令

    1.awk 可以参考:http://www.itshouce.com.cn/linux/linux-awk.html 1.1 常见语法 cat test.txt | awk 'BEGIN{print ...

  5. 今天接触枚举类型,感觉是C里面应该才有的东西

    遍历枚类型的方法: public static EActChannel getEnumByCode(int code) { for (EActChannel enm : EActChannel.val ...

  6. CSS-混合布局的几种方法(正确的方法和错误的原因)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 关于 客户端发现响应内容类型为“text/html; charset=utf-8”,但应为“text/xml”的解决方法

    http://www.cnblogs.com/jams742003/archive/2008/10/30/1322761.html 请求web服务时,会有如题的异常出现,解决方法如下: 1 检查web ...

  8. mysql if exist坑

    TOP:BEGIN #Routine body goes here... IF EXISTS ( SELECT * FROM `user` WHERE `name` = in_user_name ) ...

  9. 通过KUDU获取Azure网站的日志

    部署到Azure上的website,由于无法通过RDP的方式去登录查看log,所以我们只能通过FTP的方式或者kudu的方式进行查看,具体如下: 1.使用FTP账户和密码登录网站的KUDU界面: 如您 ...

  10. Effective Objective-C 2.0 — 第五条用枚举表示状态、选项、状态码 (未看完)

    枚举是一种常量命名方式.某个对象所经历的各种状态就可以定义为一个简单的枚举集.(enumeration set) 编译器会为枚举分配一个独有的编号,从0开始,每个枚举递增1.实现枚举所用的数据类型取决 ...