JavaScript 对象

本文内容学习于:后盾人 (houdunren.com)

一、基础理解

1.对象和方法的属性可以动态的添加或删除。

const hd = {

name:"后盾人"

};

hd.age = "10";

hd.show= function() {

return `${this.name}已经${this.age}岁了`;

};

console.log(hd.show(());

console.log(hd);

delete hd.show;

delete hd.age;

console.log(hd);

console.log(hd.age);//undefined

2.对象的比较是对内存地址的比较所以使用 ==或===样

let hd = {};

let xj = hd;

let cms = {};

console.log(hd == xi); //true

console.log(hd ==xj);//true

console.log(hd ===cms);//false

3.对象做为函数参数使用时也不会产生完全赋值,内外共用一个对象

let user = { age: 22 };

function hd(user) {

user.age += 10;

hd(user);

}

console.log(user.age); //32

4.展开语法,使用...可以展示对象的结构,下面是实现对象合并的示例

let hd ={ name:"后盾人",web: "houdurnen.com"};

let info ={ ...hd, site: "hdcms" };

console.log(info);

// 函数参数合并示例

function upload(params) {

let config = {

type: "*.jpeg,*.png",

size: 10000

};

params ={ ...config, ...params };

console.log(params);

}

upload({ size: 999 });

5.解构赋值

建议使用var/let/const声明

//对象使用

let info = {name:'后盾人',url:'houdunren.com'};

let {name:n,url:u} = info ;

console.log(n);// 后盾人

//如果属性名与变量相同可以省略属性定义

let {name,url} = {name:'后盾人'url:'houdunren.com'};

console.log(name); // 后盾人

//函数返回值直接解构到变量

function hd() {

return {

name:'后盾人',

url:'houdunren.com'

};

}

let {name: n,url: u} = hd();

console.log(n);

//函数传参

"use strict";

function hd({ name, age }) {

console.log(name, age);//向军大叔 18

}

hd({ name: "向军",age:18 });

6.严格模式

//非严格模式可以不使用声明指令,严格模式下必须使用声明。所以建议使用 let 等声明。

// "use strict";

({name,url} ={name:'后盾人',url:'houdunren.com'});

console.log(name, url);

7.简洁定义

//只赋值部分变量

let [,url]=['后盾人''houdunren.com'];

console.log(url);//houdunren.com

let {name}= {name:'后盾人',url:'houdunren.com'};

console.log(name);//后盾人

//如果属性名与赋值的变量名相同可以更简洁(直接使用变量赋值对象属性)

let name = "后盾人",url = "houdunren.com";

//标准写法如下

let hd = { name: name, url: url };

console.log(hd); //{name:"后盾人",url:"houdunren.com"}

//如果属性和值变量同名可以写成以下简写形式

let opt = { name, url };

console.log(opt);//{name:"后盾人",url:"houdunren.com"}

8.默认值

//为变量设置默认值

let [name, site = 'hdcms'] = ['后盾人'];

console.log(site);//hdcms

let {name,url,user='向军大叔’}= {name:'后盾人',url:'houdunren.com'};

console.log(name,user);//向军大叔

9.函数参数

//数组参数的使用

function hd([a,b]) {

console.log(a,b);

}

hd(['后盾人',"hdcms']);

//对象参数使用方法

function hd({name,url,user='向军大叔"}){

console.log(name,url,user);

}

hd({name:"后盾人','url':'houdunren.com'});//后盾人 houdunren.com 向军大叔

//对象解构传参

function user(name,{ sex,age }= {}) {

console.log(name, sex, age);//向军大叔 男 18

}

user("向军大叔",{sex:"男",age:18 });

二、属性管理

1.添加属性

// 可以为对象添加属性

let obj = {name:"后盾人"};

obj.site = "houdunren.com";

console.log(obj);

2.删除属性

// 使用delete 可以删除属性

let obj ={ name:"后盾人"};

delete obj.name;

console.log(obj.name);//undefined

3.检测属性

1)hasOwnProperty 检测对象自身是否包含指定的属性,不检测原型链上继承的属性。

let obj ={ name:'后盾人'};

console.log(obj.hasOwnProperty('name'));//true

2)使用 in 可以在原型对象上检测

let obj = {name:"后盾人"};

let hd = {

web: "houdunren.com"

};

//设置nd为obj的新原型

Object.setPrototypeof(obj, hd) ;

console.log(obj);

console.log("web" in obj);//true

console.log(obj.hasOwnProperty("web"));//false

4.获取属性名

使用 Object.getOwnPropertyNames 可以获取对象的属性名集合

let hd ={ name: '后盾人',year: 2010 }

const names =Object.getOwnPropertyNames(hd);

console.log(names)// ["name", "year"]

5.assign

以往我们使用类似jQuery.extend 等方法设置属性,现在可以使用Object.assign 静态方法

//从一个或多个对象复制属性"use strict";

let hd = { a: 1, b: 2 };

hd = Object.assign(hd,{ f:1 },{ m: 9 });

console.log(hd); //{a: l,b:2,f:1,m: 9}

三、遍历对象

Object.keys();获取key,得到全部key

Object.value();获取值,得到全部值

Obiect.entries();同时获取 key,值,[key,值]

// 以上三个方法返回的都是迭代对象

1.获取内容

//使用系统提供的 API 可以方便获取对象属性与值

const hd = {name:"后盾人",age:10};

console.log(Object.keys(hd)); // ["name","age"]

console.log(0bject.values(hd));//["后盾人",10]

console.table(Object.entries(hd)); //[["name","后盾人"],["age",10]]

2.for/in

// 使用for/in遍历对象属性

const hd = {name:"后盾人", age:10};

for (let key in hd) {

console.log(key, hd[key]);

}

3.for/of

for/of用于遍历 迭代对象 ,不能直接操作对象。但object对象的keys方法返回的是迭代对象。

const hd = {name:"后盾人", age:10};

for (const key of 0bject.keys(hd)) {

console.log(key);

}

*四、对象拷贝

// 对象赋值时复制的内存地址,所以一个对象的改变直接影响另一个

1.浅拷贝

1)使用for/in执行对象拷贝

let obj ={name:"后盾人"};

let hd = {};

for (const key in obi) {

hd[key] = obj[key];

}

hd.name = "hdcms";

console.log(hd);

console.log(obj);

2)Object.assign 函数可简单的实现浅拷贝,它是将两个对象的属性叠加后面对象属性会覆盖前面对象同名属性。

let user = {name:"后盾人};

let hd = {stu: Object.assign({},user)};

hd.stu.name='hdcms';

console.log(user.name);//后盾人

3)使用展示语法也可以实现浅拷贝

let obj = {name:"后盾人"};

let hd ={ ...obj };

hd.name = "hdcms":

console.log(hd);

console.log(obj);

2.深拷贝

1)浅拷贝不会将深层的数据复制

let obj = {name:'后盾人', user:{name:'hdcms'}}

let a = obj;//浅

let b = obj;//浅

//深拷贝

function copy(object) {

let obj = {}

for (const key in object) {

obj [key] = object[key];

return obj;

}

}

let new0bj = copy(obj);

newObj.name ='hdcms';

newObj.user.name ='houdunren.com';

console.log(newObj);

console.log(obj);

2)深拷贝是完全的复制一个对象,两个对象是完全独立的对象

let obj = {name:"后盾人", user:{name: "hdcms"},data: []};

//深拷贝方法

function copy(object) {

let obj = object instanceof Array?[] :{};

for (const [k, v] of Object.entries(object)){

obj [k] = typeof  v == "object" ? copy(v) : v;

}

return obj;

}

let hd = copy(obj);

hd.data.push("向军");

console.log(Json.stringify(hd,null,2));

console.log(Json.stringify(obj, null,2));

五、构建函数

1.工厂函数

在函数中返回对象的函数称为工厂函数,工厂函数有以下优点

·减少重复创建相同类型对象的代码

.修改工厂函数的方法影响所有同类对象

function stu(name) {

return {

name,

show() {

console.log(this.name);

}

};

}

const lisi = stu("李四");

lisi.show();

const xj = stu("向军");

xj.show();

2.构造函数

和工厂函数相似构造函数也用于创建对象,它的上下文为新的对象实例。

.构造函数名每个单词首字母大写即pascal 命名规范

.this指当前创建的对象

.不需要返回this系统会自动完成

.需要使用new关键词生成对象

function Student(name){

this.name =name;

this.show= function() {

console.log(this.name);

};

}

//不需要返回,系统会自动返回// return this;

const lisi = new Student("李四");

lisi.show();

const xj = new Student("向军");

xj.show();

3.严格模式

在严格模式下方法中的this值为 undefined,这是为了防止无意的修改 window 对象

4.内置构造

字面量创建的对象,内部也是调用了object构造函数

const hd = {name:"后盾人"};

console.log(hd.constructor); //? Object() { [native code] }

//下面是使用构造函数创建对象

const hdcms =new object();

hdcms.title = "开源内容管理系统";

console.log(hdcms);

// constructor 称为构造函数,因为它的作用是用于new的实例对象指回构造函数本身

5.对象函数

在Js中函数也是一个对象,可调用  .tostring()  .length()

函数是由系统内置的 Function 构造函数创建的

六、属性特征

1.查看特征

使用 object.getOwnPropertyDescriptor查看对象属性的描述。

使用object.getOwnPropertyDescriptors查看对象所有属性的描述

《属性包括以下四种特性》

特性                      说明

默认值        

configurable        能否使用 delete、能否需改属性特性、或能否修改访问器属性        

true        

enumerable        对象属性是否可通过 for-in 循环,或 object.keys()读取        

true

writable              对象属性是否可修改        

True

value                  对象属性的默认值

undefined

2.设置特征

使用object.defineProperty 方法修改属性特性,通过下面的设置属性 name 将不能被遍历、删除、修改。

使用 Obiect.defineProperties 可以一次设置多个属性,具体参数和上面介绍的一样。

3.禁止添加

Object.preventExtensions 禁止向对象添加属性

Object.isExtensible 判断是否能向对象中添加属性

"use strict";

const user = { name:"向军"};

Object.preventExtensions(user);

user.age =18; //Error

console.log(Object.isExtensible(user));//false

4.封闭对象

Object.seal()方法封闭一个对象,阻止添加新属性并将所有现有属性标记为configurable:false

Object.isSealed 如果对象是密封的则返回 true,属性都具有 configurable: false.

5.冻结对象

Object.freeze 冻结对象后不允许添加、删除、修改属性,writable、confiqurable 都标记为false

Object.isFrozen()方法判断一个对象是否被冻结

七、属性访问器

getter 方法用于获得属性值,

setter 方法用于设置属性,

这是 Js 提供的存取器特性即使用函数来管理属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值