javascript权威指南学习笔记-对象(七)

时间:2022-08-27 08:05:53

2010年后就没怎么看技术类的书了,真的快被淘汰了
ECMAScript5 定义了一个创建对象的新方法,Object.create();

var user=Object.create({name:"zhangsan",age:123});
//该方法与下面的目的一样
var user={};
user.name="zhangsan";
user.age=123;

var user={name:"zhangsan",age:123}

var user=new Object();
user.name="zhangsan";
user.age=123;

采用Object.create()来实现原型继承

function inherit(p){
if(p==null){
throw TypeError();
}
//判断是否支持ECMAScript5的语法 如果支持直接调用
if(Object.create){
return Object.create(p);
}else{
//如果不支持则采用原型继承的方式来实现
var t=typeof p;
if(t!="Object"&&t!=="function()){
throw TypeError();
}
function F(){
}
F.prototype=p;
return new F();
}
}

属性的特性,我学习js的时候属性都是可写、可枚举、可配置的,到ECMAScript5属性的特性却不一样了。
数据属性:value、writable、enumerable、configurabel
存取器属性:get、set 、enumerable、configurable
可以通过Object.getOwnPropertyDescriptor();来获取属性描述

var user={name:123}
console.log(Object.getOwnPropertyDescriptor(user,"name"));
//输出Object {value: 123, writable: true, enumerable: true, configurable: true}

先来了解下存取器的get、set方法:

 var userFun={
_name:"zhangsan",
set name(value){
this._name=value;
},
get name(){
return this._name;
}
}
userFun.name="李四";
console.log(userFun.name);
//输出为李四

看到这代码,可能会觉得多此一举

 var userFun={
_name:"zhangsan",
set name(value){
this._name=value;
},
get name(){
return this._name+"123";
}
}
userFun.name="李四";
console.log(userFun.name);
//这里输出的就是 李四123咯,对值进行了修饰,在一些程序这个功能就非常有意义了

接着我们输出存取器的属性描述

   var userFun={
_name:"zhangsan",
set name(value){
this._name=value;
},
get name(){
return this._name+"123";
}
}
console.log(Object.getOwnPropertyDescriptor(userFun,"name"));
//输出Object {get: function, set: function, enumerable: true, configurable: true}

如果想设置属性的特性,可以通过Object.defineProperty();

    var user={
}
Object.defineProperty(user,"name",{writable:false});
user.name="zhangsan";
console.log(user.name);
//这里输出竟然是undefined