属性有属性标签,对象也有对象标签
proto标签(原型链)
class标签(表示对象的类型)
extensible(对象是否可扩展(属性是否可添加))
var obj={x:1,y:2}
Object.isExtensible(obj);//true当前obj对象可扩展
Object.preventExtensions(obj);//修改obj对象的extensible标签为false
Object.isExtensible(obj);//false
Object.getOwnPropertyDescriptor(obj,'x');
//Object{value:1,writable:true,configurable:true,enumerable:true}
Object.seal(obj);//将对象修改为不可删除、不可修改属性标签
//Object{value:1,writable:true,configurable:false,enumerable:true}
Object.isSealed(obj);//判断对象是否被seal操作。//true
Object.freeze(obj);//设置对象不可改不可写不可被枚举不可被删除;
//Object{value:1,writable:false,configurable:false,enumerable:false}
Object.isFrozen(obj);//判断对象是否被‘冻结’
extensible标签只能对相应的对象进行修改,并不影响原型链。
序列化:JSON.stringify(obj);//将字符串传给后端
JSON.parse('{x:1}');从后端传给前端
标签属性和标签函数自定义的应用,以及序列化的应用(序列化就是在对象和json之间进行转换,stringfied和parse)
//不能刷新,不能返回,不然全没了
undefined
//对象标签
undefined
//下面一个查看class的标签
undefined
var toString = Object.prototype.toString;//宏定义成一个方便后续使用,以前也讲过用with
undefined
function getType(o){return toString.call(o).slice(8,-1);}//这个是为了截取下来类型
undefined
toString.call(null)
"[object Null]"
//如果上面没有截取就是显示一个带有括号的字符串
undefined
getType(null)
"Null"
getType(1)
"Number"
getTp
VM18518:1 Uncaught ReferenceError: getTp is not defined
at <anonymous>:1:1
(anonymous) @ VM18518:1
getType(new Number(1))
"Number"
//会发现上面给的不是object而是number,是因为这个是一个传入的参数
undefined
getType([1,2])
"Array"
//extensible标签表示对象是否可以扩展,是否可以继续添加属性
undefined
var obj = {x:1,y:2};
undefined
6008:1 Unchecked runtime.lastError: The message port closed before a response was received.
//当然这个extensible是一类标签,他下面有很多方法来进行控制,首先是isExtensible还有seal还有freeze,我们会通过一个案例来进行判断
undefined
Object.isExtensible(obj)
true
Object.preventExtensions(obj)//这个是主要函数,防止扩展
{x: 1, y: 2}
Object.isExtensible(obj)
false
obj.z = 10
10
obj.z
undefined
//上面就会发现不能扩展了
undefined
Object.isSealed(obj)
false
Object.isSealed(obj)//这个函数是查看是否可以删除,sale是封装的意思
false
Object.seal(obj)
{x: 1, y: 2}
Object.isSealed(obj)
true
Object.getOwnPropertyDescriptor(obj)
undefined
Object.getOwnPropertyDescriptor(obj,'x')
{value: 1, writable: true, enumerable: true, configurable: false}
//上面就会发现里面的configureable都变成了false
undefined
Object.freeze(obj)//这个是冻结函数,这个可以进行将属性冻结住,这样这个对象下的所有属性都不可以被改写了
{x: 1, y: 2}
Object.getOwnPropertyDescriptor(obj,'x')
{value: 1, writable: false, enumerable: true, configurable: false}
//会发现上面的writable变成了false
undefined
//!!!但是我们都是只冻结这个对象并不会冻结它的原型链
undefined
//
undefined
//
undefined
//
undefined
//下面序列化的一种方法
undefined
//所谓的序列化就是将obj的所有属性变成一个json对象,这样方便后台进行操作
undefined
var obj = {val:undefined,a:NaN,b:Infinity,c:new Date()};
undefined
JSON.stringify(obj)//这个就是序列化的函数
"{"a":null,"b":null,"c":"2021-03-02T12:05:19.349Z"}"
//会发现输出的结果里面不会显示undefined的属性,nun和infinity都会变成null,date会被另一种格式输出
undefined
//单数不管怎么说,都是json的格式输出出来了
undefined
//当然也可以逆变换,就是将json的格式变成obj形式
undefined
var obj2 = JSON.parse('{"x":1}');
undefined
obj2
{x: 1}
//注意json格式的书写
undefined
//当然序列化也可以自定义,这个情况下就是需要在里面定义一个tojson的函数
undefined
var obj3 = {
x:1,
y:2,
}
undefined
var obj3 = {
x:1,
y:2,
o:{
o1:1,
o2:2,
toJSON:function(){return this.o1+this.o2;}
},
}
undefined
obj3.o.o1
1
//上面在属性里面又另外添加了一个toJSON的属性,所以再次序列化的时候就会调用里面的这个函数
undefined
JSON.stringify(obj3)
"{"x":1,"y":2,"o":3}"
//可以看到上面的o就是哦
undefined
//可以看到上面的o就是o1+o2
undefined
//以前讲变量类型的时候只讲过基本类型之间的转换,但是对象也可以转换成基本类型,这个涉及到对象的两个方法,一个是toString方法,一个是valueOf方法,这两个方法是将对象转换成基本类型的常用方法,而且是可以自己进行调用的,你只需要设置
undefined
obj3
{x: 1, y: 2, o: {…}}
obj3.toString()
"[object Object]"
obj.toString() = function(){return this.x+this.y;};
VM25614:1 Uncaught ReferenceError: Invalid left-hand side in assignment
at <anonymous>:1:5
(anonymous) @ VM25614:1
obj.toString = function(){return this.x+this.y;};
ƒ (){return this.x+this.y;}
//上面就是对tostring的定义
undefined
obj3.toString = function(){return this.x+this.y;};
ƒ (){return this.x+this.y;}
"Result"+obj3;//这个时候就会对这个对象进行隐士的转换成基本类型
"Result3"
+obj3
3
obj3.valueOf = function(){return this.x*this.y;};
ƒ (){return this.x*this.y;}
//上面就是将对象转换成基本类型里面的数字,所以当我们想要转换成数字的时候,例如进行+obj3的操作时候,就会先调用valueOf这个函数,如果报错或者不存在就会寻找tostring这个函数,如果不存在就报错
undefined
+obj3
2
//这个时候就会变成2
undefined
转义对象,值为undefined时无法显示。(第四章六节)
这里他说的是 "如果valueOf返回的是对象 valueOf也不会被使用 而会转为去找toString执行 如果toString也是返回对象 那么加法则无法执行 即为报错"
我的试验是 如果同时有toString和valueOf 每种情况下 会先调用valueOf而不调用toString
这里出现了 对象自定义toString 和valueOf
其他的编程语言也会有这个方法的重定义 比如 Java
注意 toString在处理纯数字的时候 会返回[object Number] 所以toString实际上是把值类型判为了引用类型
关于 JSON.stringify 的注意事项:
当值是NaN/Infinity时 "字符串化"之后是 null
当值是new Date()时 "字符串化"之后是 时间字符串
Object.isExtensible //判断是否可扩展
Object.preventExtensions
Object.seal
Object.isSealed
Object.freeze
Object.isFrozen
获取变量的类型
toString = Object.prototype.toString;
toString.call(XXX).slice(8,-1);
json 属于键值对,可以有效的储存数据,实际项目中前后台传值,接口返回值 一般都用这种格式的 解析和储存 都很方便
本章知识:
toString 与valueOf都存在的情况下,“Result”+obj先找valueOf,没有则找toString,也没有则报错。
自定义序列化:
Object.preventExtensions(obj)
Object.seal(obj);
Object.freeze(obj);
extensible标签
决定对象是否可以扩展,对象上的属性是否可以添加
Object.isExtensible()默认为true
Object.preventExtensions(obj);//将对象设置为不可以扩展
Object.seal()
方法封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置。当前属性的值只要原来是可写的就可以改变。
Object.isSealed(obj);//true/false判断是否被seal
Object.freeze(obj); 冻结对象:不可写,不可改,不可添加属性,不可删除属性
Obgect.isFFrozen(obj);//判断是否被冻结 true/false
以上方法不会影响原型链
class标签类型
确定方式:Object.prototype.toString.call();
call()接受传入的任何数据
slice(8,-1)是截取字符,从第8个到最后一个全部删除
通过JSO.parse('{"x":1}');将json数据转化为javascirpt类型数据
isExtensible(obj) 扩展
Object.preventExtensions(obj)
obj.z = 1;
Object.seal()
Object.freeze(obj)
toString
extensible为对象的可扩展性,有preventExtension方法来对对象添加属性作显示,但是已有的对象仍然可以删除修改,而seal方法则是对对象的configurable设为false,让对象无法删除属性从而重新定义,而freeze则是让对象进一步变为不可写
小结小结小结
valueof和tostring都存在时不管是一元+号,还是二元的字符串拼接的+号,都会尝试把对象转换为基本类型,先去找valueof,如果valueof返回基本类型的话就以valueof做为结果,反之就会去找tostring
自定义valueof,尝试对象转换为基本类型时调用
一元操作符,也会调用tostring
自己定义tostring方法,"result"+obj,会obj转换为字符串,调用tosting方法
自定义的序列化,用函数把两个相加
JSON.parse解析成JS对象,X要双引号括起
属性有值为underfined时,序列化不一样,不会出现在序列化后的字符串里