博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面向对象(理解对象)——JavaScript基础总结(一)
阅读量:7196 次
发布时间:2019-06-29

本文共 3306 字,大约阅读时间需要 11 分钟。

定义

无序属性的集合(散列表),其属性可以包含基本值,对象或函数;

每个对象都是基于一个引用类型创建的,这个引用类型可以是原生类型,也可以是自定义类型。

创建对象

创建一个Object实例

var person = new Object()        person.name = 'Memory'    person.age = 24                    person.sayName = function () {        console.log(this.name)  // Memory    }复制代码

对象字面量

var person = {        name: 'Memory',        age: 24,            sayName: function () {            console.log(this.name)  // Memory        }    }复制代码

其中nameage是person的属性,sayName是person的方法。

属性类型

只有内部才用的特性,在JS中不能直接访问它们,为了表示特性是内部值,把它们放到了[[]]中;

ECMAScript中有以下两种属性,数据属性和访问器属性。

数据属性

其中,person.name的[Configurable]]、[[Enumerable]]、[[Writable]]都为true,[[Value]]为Memory。

修改数据属性:Object.defineProperty(对象obj, [属性名称], 描述符对象)

其中,描述符对象的属性必须是configurable、enumerable、writable、value之内的一到四个。

在调用Object.defineProperty时,如果不指定,configurable、enumerable、writable的值都默认为false

在把configurable设为false之前,可以多次调用Object.defineProperty()修改同一个属性。之后修改除writable之外的其他特性,都会导致错误;

尝试修改writable:

Object.defineProperty(person, 'name', {        configurable: false,    })        console.log(person.name)   // Memory        Object.defineProperty(person, 'name', {        writable: true,        value: 'doublemeng'    })        console.log(person.name)   // doublemeng复制代码

尝试修改configurable:

Object.defineProperty(person, 'name', {        configurable: false,    })        console.log(person.name)   // Memory        // Uncaught TypeError: Cannot redefine property: name    Object.defineProperty(person, 'name', {        configurable: true,        value: 'doublemeng'    })        console.log(person.name)   复制代码

configurable设为false,即表示不能从对象中删除属性;

如果这个对象调用delete,非严格模式下会被忽略,严格模式下则会抛错。

writable设为false,即表示该属性不可写;

非严格模式下会被忽略,严格模式下则会抛错。

访问器属性

访问器属性包含getter和setter函数(这两个函数都不是必需的),其中setter用来写值,getter用来读值。

设置一个属性的值会导致其他属性的变化,如下例year的变化导致_yearage的变化:

var book = {        age: 1,        _year: 2000   // 只能通过对象方法访问的属性    }        console.log(book._year)   // 2000    console.log(book.age)   // 1        Object.defineProperty(book, 'year', {        get: function () {            return this._year        },        set: function (newYear) {            this._year = newYear            this.age = newYear - 2000 + 1        }    })        book.year = 2019        console.log(book._year)   // 2019    console.log(book.age)   // 20复制代码

不一定非要指定getter和setter;

只指定getter意味着属性只能读不能写;

尝试写入,在非严格模式下会被忽略,严格模式下则会抛错。

只指定setter意味着属性只能读不能读;

尝试读取,在非严格模式下会返回undefined,严格模式下则会抛错。

在该方法之前,要创建访问器属性一般要使用两个非标准的方法:__defineGetter__()__defineSetter__()

var book = {        age: 1,        _year: 2000   // 只能通过对象方法访问的属性    }        console.log(book._year)   // 2000    console.log(book.age)   // 1        book.__defineGetter__('year', function () {        return this._year    })        book.__defineSetter__('year', function (newYear) {        this._year = newYear        this.age = newYear - 2000 + 1    })        book.year = 2019          console.log(book._year)   // 2019    console.log(book.age)   // 20复制代码

不支持Object.defineProperty()的浏览器不能修改[Configurable]][[Enumerable]]

定义多个属性

Object.defineProperties(对象obj,对象 其属性为obj要添加和修改的属性)

读取属性的特性

Object.getOwnPropertyDescriptor(对象属性)

参考

《JavaScript高级程序设计》

小结

本文主要介绍了对象属性的各种特性。其主要包括数据属性的[[Configurable]][[Enumerable]][[Writable]][[Value]]和访问器属性的[[Configurable]][[Enumerable]][[Get]][[Set]]

如有问题,欢迎指正。

转载于:https://juejin.im/post/5c9a3f92f265da611e17833e

你可能感兴趣的文章
一些Perl例程(全部手打并执行过)
查看>>
“精确”判断一个浮点数是否等于0
查看>>
《Java与模式》- 行为型模式
查看>>
WPF 中 ICollectionView 及 ItemsControl 相关的重点
查看>>
九、 编写Module模块
查看>>
使用Bower作为Web包管理器
查看>>
Android中实现Launcher功能之二 ----- 添加窗口小部件以及AppWidget的创建详解
查看>>
关于如何准备一场演讲 - 清单
查看>>
C++返回值优化RVO
查看>>
谈谈年底感想
查看>>
LintCode: strStr
查看>>
ABP框架理论研究总结(典藏版)
查看>>
利用chrome的调试功能调试JavaScript代码
查看>>
阿里云前端周刊 - 第 38 期
查看>>
[转]linq查询运算符大全
查看>>
DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity,
查看>>
理解 OpenStack + Ceph (4):Ceph 的基础数据结构 [Pool, Image, Snapshot, Clone]
查看>>
page类与页面生命周期
查看>>
【设计模式】外观模式
查看>>
Flume的各种类型的组件介绍
查看>>