Constructor和Object
Constructor
对象的constructor属性用于返回创建该对象的函数,也就是我们常说的构造函数。
在JavaScript中,每个具有原型的对象都会自动获得constructor属性。除了arguments、Enumerator、Error、Global、Math、RegExp、Regular Expression等一些特殊对象之外,其他所有的JavaScript内置对象都具备constructor属性。例如:Array、Boolean、Date、Function、Number、Object、String等。
语法
Object.constructor
返回值
对象的constructor属性返回创建该对象的函数的引用。
示例&说明
对象创建
创新新对象,在javascript中通常有两种方法:
1.对象直面量方法
var newObj = {};
2.构造器的简洁方法
var newObj = new Object();
在Object构造器为特定的值创建对象封装,或者没有传递值时,它将创建一个肯那个对象并返回
对象赋值的方法:
1.“点”方法
1
2
3
4
|
//设置属性 newObj.name = 'LanFeng' ; //获取值 var user= newObj.name; |
1.中括号方法
1
2
3
4
|
//设置属性 newObj[ "name" ]= 'LanFeng' ; //获取值 var user= newObj[ "name" ]; |
1.Object.defineProperty (适用ECMAScript5)
1
2
3
4
5
6
7
|
//设置属性 Object.defineProperty(newObj, "name" ,{ value: "LanFeng" , writable: true , enumerable: true , configurable: true }) |
1.Object.defineProperties
1
2
3
4
5
6
7
8
9
10
11
|
//设置属性 Object.defineProperties(newObj,{ "someKey" :{ value: "Hello Js" , writable: true }, "anotherKey" :{ value: "Foo bar" , writable: false } }) |
Javascript不支持类的概念,但它确实支持与对象一起用的特殊constructor函数,通过在构造器前面加new关键字,告诉js像使用构造器一样实例化一个新对象,并且对象成员由该函数定义。
在构造器内,关键字this引用新创建的对象。回顾对象创建,基本的构造器:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
function Car(model,year,miles){ this .model = model; this .year = year; this .miles = miles; this .toString = function (){ return this .model + "has done" + this .miles + "miles" ; } } //创建实例化对象 var civio = new Car( "Honda Civio" ,2009,20000); var mondeo= new Car( "Ford Mondeo" ,2009,5000); |
上面例子是一个简单的构造器模式版本,但它确实存在一些问题,其中一个问题是,它使用继承变得困难,另外一个问题是,toString()这样的函数是为每个使用Car构造器创建的新对象而分别重新定义的,这个不是最理想的,因为这种函数应该在所有的Car类型实例直接共享。
javascript中有有一个prototype的属性,调用js构造器创建一个对象后,新对象就会具有构造器原型的所有属性,通过这种方式,可以创建多个对象,并访问相同的原型,实现方法共享。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
function Car(model,year,miles){ this .model = model; this .year = year; this .miles = miles; } //原型函数 Car.prototype.toString = function (){ return this .model + "has done" + this .miles + "miles" ; } //创建实例化对象 var civio = new Car( "Honda Civio" ,2009,20000); var mondeo= new Car( "Ford Mondeo" ,2009,5000); console.log(civio.toString()) console.log(mondeo.toString()) |
Object
一、Object类介绍
Object类是所有JavaScript类的基类(父类),提供了一种创建自定义对象的简单方式,不再需要程序员定义构造函数。可以在程序运行时为Javascript对象随意添加属性,因此可以很容易地创建自定义对象。
二、Object类主要属性
1.constructor:对象的构造函数。
2.prototype:获得类的prototype对象,static性质, 对象的引用。
三、Object类主要方法
1.hasOwnProperty(propertyName)
判断对象是否有某个特定的属性。必须用字符串指定该属性,例如,obj.hasOwnProperty("name"),返回布尔值。此方法无法检查该对象的原型链中是否具有该属性;该属性必须是对象本身的一个成员。
2.isPrototypeOf(object)
判断该对象是否为另一个对象的原型。
obj1.isPrototypeOf(obj2);
obj1是一个对象的实例;obj2是另一个将要检查其原型链的对象。原型链可以用来在同一个对象类型的不同实例之间共享功能。如果obj2的原型链中包含 obj1,那么isPrototypeOf 方法返回true。如果obj2不是一个对象或者obj1没有出现在obj2中的原型链中,isPrototypeOf 方法将返回 false。
3.propertyIsEnumerable(propertyName)
通过这个方法我们可以检测出这个对象成员是否是可遍历的,如果是可遍历出来的,证明这个对象就是可以利用for in 循环进行遍历的,格式如下:obj.propertyIsEnumerable(propertyName)
如果 propertyName存在于 obj中且可以使用一个 For…In 循环穷举出来,那么 propertyIsEnumerable 属性返回 true。如果 object 不具有所指定的属性或者所指定的属性不是可列举的,那么 propertyIsEnumerable 属性返回 false。
典型地,预定义的属性不是可列举的,而用户定义的属性总是可列举的。
4.toString()
返回对象对应的字符串
5.valueOf()
返回对象对应的原始值
以上5个方法都是Object.prototype上定义的,ECMAScript中的所有对象都由Object继承而来,所以在ECMAScript上的所有对象都具有以几个方法