Javascript-6对象

Javascript-6对象

6.1创建对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86

/*
*
* 如何获取该变量(对象)是不是属于什么类型的?
* 语法:
* 变量 instanceof 类型的名字----->布尔类型,true就是这种类型,false不是这种类型
* 在当前的对象的方法中,可以使用this关键字代表当前的对象
*
*
* */
//工厂模式创建对象
function createObject(name,age) {
var obj = new Object();//创建对象
//添加属性
obj.name = name;
obj.age = age;
//添加方法
obj.sayHi = function () {
console.log("阿涅哈斯诶呦,我叫:" + this.name + "我今年:" + this.age);
};
return obj;
}
//创建人的对象
var per1 = createObject("小芳",20);
per1.sayHi();
//创建一个人的对象
var per2 = createObject("小红",30);
per2.sayHi();
console.log(typeof per1);


//自定义构造函数创建对象,我要自己定义一个构造函数,自定义构造函数,创建对象
//函数和构造函数的区别;名字是不是大写(首字母是大写)
function Person(name,age) {
this.name=name;
this.age=age;
this.sayHi=function () {
console.log("我叫:"+this.name+",年龄是:"+this.age);
};
}

//自定义构造函数创建对象:先自定义一个构造函数,创建对象
var obj=new Person("小明",10);
console.log(obj.name);
console.log(obj.age);
obj.sayHi();
console.log(typeof obj)
var obj2=new Person("小红",20);
console.log(obj2.name);
console.log(obj2.age);
obj2.sayHi();


console.log(obj instanceof Person);
console.log(obj2 instanceof Person);


//自定义狗的构造函数,创建对象
function Dog(name,age,sex) {
this.name=name;
this.age=age;
this.sex=sex;
}
var dog=new Dog("大黄",20,"男");
console.log(dog instanceof Person);//false
console.log(dog instanceof Dog);

var obj={};
obj.name="小白";
obj.age=10;
obj.sayHi=function () {
console.log("我是:"+this.name);
};
obj.sayHi();
var obj2={
name:"小明",
age:20,
sayHi:function () {
console.log("我是:"+this.name);
},
eat:function () {
console.log("吃了");
}
};
obj2.sayHi();
obj2.eat();

6.2属性的查询和设置

  • 获取属性的值
    • 点 可以是任何数据类型
    • 方括号 只能返回字符串
1
2
3
let author = book.author
let name = author.name
let title = book["main titkle"]
  • 创建属性或者给属性赋值
    • 点 (.)
    • 方括号
1
2
book.edition = 9;
book["main title"] = "ECMAScript"

作为关联数组的对象

  • 关联数组:使用方括号和一个字符串,更像数组,只是这个数组元素是通过字符串索引而不是数字索引
  • 通过[]来访问对象的属性时候,使得在运行程序的时候可以修改或者创建
1
2
3
4
5
6
let addr = " ";
for(let i = 0;i<4;i++)
{
//就是把
addr+=customer["address"+i]+"\n";
}

继承

  • 对象有一些属性是从原型对象继承而来
  • 家是要查询对象o的属性,如果o中不存在x,那么将会继续在o的原型对象中查询属性x。如果原型对象中也没有x,但这个原型对象也友原形,bane继续在这个原型对象的原型上查询,直到找到或者原型是NULL为止
  • 对象的原型属性构成了一个链,通过这个链可以实现属性的继承

示例

  • 属性赋值:
    • 首先检查原型链,以此判定是否允许赋值操作
    • 如果允许属性赋值操作,他也总是在原始对象上创建属性或对已有的属性赋值,而不会去修改原型链

示例

属性访问错误

示例

6.3删除属性

delete运算符

  • 他的操作数应当是一个属性访问表达式
  • 只能删除自有的属性,不能删除继承的属性
    • 要删除继承的属性必须从定义这个属性的原型对象上删除它
1
2
3
4
5
6
7
8
delete book.author;
delete book["main title"];

o = {x:1}; //o 有一个属性,并且继承了属性toString
delete o.x; //删除x,返回true;
delete o.x; //什么也没做,x已经被删除了
delete o.toString ; //什么也没做,因为toString是继承来的,无法删除
delete 1; //无意义,返回true

6.4检测属性

  • in 运算符
    • 如果对象的自由属性或者继承属性中包含这个属性则返回true
  • hasOwnProperty()
    • 是否是对象的自有属性
  • propertyIsEnumerable()W
    • 只有检测到是自由属性,且这个属性是可枚举的才会返回true
  • “!==undefined”
    • 判断一个属性是否为undefined(无法区分存在但值位undefined的属性)

示例

示例

6.5枚举属性

遍历对象的属性

  • for/in (对象名或索引)循环 for/of (值)循环
    • 遍历对象中所有可枚举的属性(包括自有属性和继承属性)
  • Object.keys( 对象名 )
    • 返回可枚举的自有属性
  • Object.getOwnPropertyNames( 对象名 )
    • 同Object.keys( ),但也返回属性名字是字符串的不可枚举属性

示例

6.6属性getter 和setter

1
2
3
4
5
6
7
var o ={
//普通数据属性
data_prop: value;
//存取器属性都是成对定义的函数
get accessor_prop (){ /*这里是函数体*/}
set accessor_prop (value){ /*这里是函数体*/}
}
  • 同时具有getter和setter方法,是一个读/写属性
  • 只有getter方法,是只读属性
  • 只有setter方法,是只写属性,读取只写属性总是返回undefined;

示例

示例

示例

6.7属性的特性

  • 一个属性包含一个名字和4 个特性
    • 值 value
    • 可写性 writable
    • 可枚举性 enumerale
    • 可配置性 configurable
  • 本节中,存储器属性的getter和setter方法看成是属性的特性
    • 存取器属性的4个特性是读取,写入,可枚举性,可配置性

示例

示例

  • 设置属性的特性
    • Object.defineProperty()
    • 注意,这个方法要么修改已有的属性要么新建自有属性,但不能修改继承属性

示例

  • 同时修改多个属性

示例

示例

对象的三个属性

  • 每一个对象都有与之相关的原型(prototype),类(class)和可扩展性(extensibleattribute)

6.8.1原型属性

  • 对象的原型属性是用来继承属性的
  • 查询原型 Object.getPrototypeOf()
  • p.isPrototypeOf(o)用来检测p是否在o的原型链中(o是否继承于p)

示例

6.8.2类属性

+ 类属性是一个字符串,用以表示对象的类型信息
+ classof()函数可以返回传递给它的任意对象的类。classof()函数可以传入任何类型的参数。数字、字符串和布尔值可以直接用toString()方法,就和对象调用toString()方法一样,并且这个函数包含了对null和undefined的特殊处理

示例

6.8.3可扩展性

  • 表示是否可以给对象添加新属性,可扩展属性的目的是将对象“锁定”。以避免外界的干扰
  • Object.isExtensible()判断该对象是否是可扩展
  • Object.preventExtension(将对象转换为不可扩展的
    • 一旦对象转换为不可扩展的,就无法再转换回可扩展的
    • 但可以给不可扩展的对象的原型添加属性
  • Object.seal()设置对象不可扩展,自有属性不可配置
    • Object.isSealed()来检测对象是否封闭
  • Object.freeze()设置对象不可扩展,属性不可配置,数据属性只读(若存取器属性具有setter仍然可以通过给属性赋值调用)
    • Object.isFrozen()来判断对象是否冻结

示例

6.9序列化对象

  • 对象序列化是指将对象的状态转换为字符串,也可将字符串还原为对象
  • JSON.stringify()序列化对象
  • JSON.parse() 还原对象

示例

示例

6.10对象方法

  • toString ()
  • toLocaleString()
  • toJSON()
  • valueOf()

toString()

示例

toLocaleString ()

示例

toJSON()

示例

ValueOf()

示例

补充

this 指代当前对象,在哪个对象中实现就指代那个对象

示例

示例

-------------本文结束,感谢您的阅读-------------