js笔记 | object类型对象

本文深入探讨JavaScript中创建对象的三种方法:直接使用花括号、使用function和使用Object.create方法。同时,解析对象的命名数据属性、命名访问器属性及内部属性,并通过实例展示属性的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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关键字,则创建对象。

创建过程
  1. 创建function对应类型的空object类型对象
  2. 将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.三种属性类型

  1. 命名数据属性(named data properties)
    由属性名和属性值组成
  2. 命名访问器属性(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]]等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值