1.创建object类型对象的三种方式
1.直接使用花括号创建
直接将属性写到花括号中就可以,属性名和属性值使用冒号(:)分割,不同属性间用逗号(,)分割(最后一个属性后面没有逗号),属性的值可以是直接量,也可以说是object类型对象或者function类型对象。
var obj={
v:6, //直接量属性
innerObj:{ //object类型对象属性
v:7
},
logV:function(){ //function类型对象属性
console.log(this.v)
}
}
console.log(obj.v);
console.log(obj.innerObj.v);
obj.logV ();
2.使用function创建
直接在function对象前面使用new关键字就可以
function F(){
this.v=1
}
var obj=new F() //创建F类型对象obj
console.log(obj.v) //1
使用function创建object类型的对象,只需要在fucntion对象前面加new关键字就可以。也就是说,对于一个function类型的对象,如果调用时前面无new关键字,那么调用方法处理业务,若有new关键字,则创建对象。
创建过程
- 创建function对应类型的空object类型对象
- 将function的函数体作为新创建的object类型对象的方法来执行(主要目的是初始化object对象)
function Car(color,displacement){
this.color=color;
this.displacement=displacement;
}
var car=new Car("black","2.4T");
console.log(car.color+" "+car.displacement); //black 2.4T
首先创建了function类型的Car,然后使用它新建object类型的car实例对象。在新建car对象时首先会新建Car类型的空对象car,然后再将Car函数作为新建对象的方法来调用,从而初始化新建的car实例对象,相当于:
fucntion Car(){}
var car=new Car();
car.init=function (color,displacement){
this.color=color;
this.displacement=displacement;
};
car.init("black","2.4T");
console.log(car.color+" "+car.displacement); //black 2.4T
将原来Car对象中的函数体 内容放到新建的car的init方法中,在使用Car创建完car实例对象后,在调用init方法初始化。特别注意,差ungjianguochengdedierbu,也就是说,在使用function对象新建object对象时依然会执行function的函数体。
3.使用Object.create方法创建
Object是ES中内置的一个function类型的对象,create是Object对象的一个属性方法,其作用是根据传入的参数创建object类型的对象。
调用语法:
Object.create(prototype,[propertiesObject])
第一个参数prototype是创建的对象所对应的prototype,相当于function创建时function中的prototype属性对象,创建出来的object对象实例可直接调用。
第二个参数prototiesObject为属性描述对象,是可选参数,用于描述所创建对象的自身属性。属性描述对象是object类型对象,它里面的属性名会成为所创建对象的属性名,属性值为属性的描述对象,其中包含属性的特性
var obj=Object.create(
//prototype
{
type:"by create"
},
//prototiesObject
{
color:{
value:"red",
enumerable:true
},
size:{
value:"37",
enumerable:true
}
}
);
console.log(obj.type); //by create
console.log(obj.color); //red
console.log(obj.size); //37
console.log(obj.Object.getOwnPropertyNames(obj)); //["color","size"]
例子中,对obj可以调用prototype中的type属性,但并不属于Object.getOwnPropertyNames方法就可以获取obj自己所拥有的属性。
另外,需要注意,使用花括号和function创建的对象都可以调用Object的prototype属性对象中的属性。即这两种方法创建出来的对象首先会拥有公共的portotype,然后使用function创建的对象还可以调用function的prototype中的属性,而且即使function的prototype为null,创建的对象也可以调用Object的prototype中的属性。但是,使用Object.create创建对象时,如果第一个参数为null,那它所创建的对象将不可以调用Object的prototype中的属性。
//使用花括号创建对象braceObj
var braceObj={}
//使用function创建对象functionObj
function F(){}
F.prototype=null;
var functionObj=new F();
//使用create方法创建createObj
var createObj=Object.create(null);
console.log(braceObj.toString()); //[object Object]
console.log(functionObj.toString()); //[object Object]
console.log(createObj.toString()); //抛出方法没找到异常
toString方法是Object的prototype属性中的一个方法,如果创建出来的对象可以调用toString方法,则说明可以调用Object的prototype属性对象中的方法,否则不可调用。例子中使用Object.create创建出来的对象,若其prototype参数为null则不可调用。
2.对象的属性
1.三种属性类型
- 命名数据属性(named data properties)
由属性名和属性值组成 - 命名访问器属性(named accessor properties)
使用getter、setter或其中之一来定义的属性。setter用于给属性赋值,是只可以写入的属性,getter用于获取属性的值,是只读属性。
function log(msg){
console.log(msg)
}
var colorManager={
_colorNum:3,
_accessColor:["red","green","blue"],
_color:"red",
//colorNum为只读属性,只需定义get方法
get colorNum(){
return this._colorNum;
}
//accessColors为只可写入的属性,只需要定义set方法
set accessColors(colors){
this._colorNum=colors.length;
this._accessColors=colors;
log("accessColors被修改了");
},
//color为可读写属性同时定义get、set方法
set color(color){
if(this._accessColors.indexOf(color)<0){
log("color不在荀彧范围内");
return;
}
log("color值被修改为"+"color");
this._color=color;
},
get color(){
log("正在获取color值");
ig(this.accessColors.indexOf(this._color)<0){
return null;
}
return this._color;
}
}
log(colorManger.color); //正在获取color值red
colorManager.accessColors=["white","black","red","yellow","orange"];//accessColors被修改了
log(colorManager.colorNum); //5
colorManger.color="blue"; //color不在允许范围内
colorManger.color="orange"; //color值被修改为orange
log(colorManager.color); //正在获取color值orange
colorManager对象有三个访问其属性:只有getter方法的
colorNum是只读属性,表示可以使用color的数量;
只有setter方法的accessColors是只写属性,表示可以使用color的数组;
color是可读写属性,表示当前color的值
由此可见,getter和setter方法本身并不可以保存属性的内容。
3. 内部属性(internal properties)
内部属性的作用是用来控制对象本身的行为。所有对象共有的内部属性共12个:[[Prototype]]、[[Class]]、[[Extensible]]、[[Get]]、[[GetOwnProperty]]、[[GetProperty]]、[[Put]]、[[Canput]]、[[HansProperty]]、[[Delete]]、[[DefaultValue]]、[[DefineOwnProperty]]
除此之外不同的对象可能还会有自己的内部属性,如Function类型对象的[[HansInstance]]
、RegExp类型对象的[[Match]]
等。