一、常见创建对象的方式
1.{} 这个叫做对象字面量
var obj = {};
- new Object() 这个叫做new出来的对象
var obj2 = new Object();
这两种创建对象方式,从测试效果来看,{}会快一点,new关键字调用了构造函数而{}不会。如果new Object()中没有传入参数,与{}是一样的。
3.探讨一下new做了什么?
//自定义new function Person(name,age) { this.name = name; this.age = age; }
var person = new Person("muzidigbig",23);
console.log(person);//Person {name: "muzidigbig", age: 23}
new创建过程:
1).首先,创建一个新的空对象。即:var person = {}
2).再次,新对象的__ptoto__属性指向了构造函数的原型对象。即:person.person === Person.prototype
3).然后,将构造函数中的this指向新对象。即:Person.call(person)
4).再然后,执行构造函数内部的代码将属性添加给新实例对象person。
5).最后,返回新实例对象person。
原理:
1、2、3)隐式操作调用Object.create(继承某个对象的原型,{给新对象添加属性});
使用new关键字创建对象的最根本原理是内部调用了Object.create();方法来实现,并由此实现原型继承。
二、new Object(value); 参数
new Object()将会根据参数value的数据类型,返回对应类型的对象:
1.如果value为基本数据类型String、Number、Boolean,则返回对应类型的对象。
传入String 返回String,类似new String()
传入Number 返回Number,类似new Number()
2.如果value本身为对象,则返回其本身。
3.如果省略了value参数,或value为null、undefined,则返回自身无任何属性的Object对象,即返回一个空对象<===>{}。
复制代码
var obj = new Object("muzidigbig"); console.log(obj instanceof Object);//true console.log(obj instanceof String);//true console.log(obj.length);//4 console.log(obj[0]);//m /即类似于obj = {0:"t", 1:"e", 2:"x", 3:"t"};/ var obj1 = new Object({age:23}); console.log(obj1.age);//23
总结:
var obj = function() {}; var a = {}; var b = new Object(); var c = new Obj();
c最快,a次之,b最慢。
三、使用Object.create(obj,propertiesObject)方法创建对象
使用这种方式创建对象,可以很方便的从一个已经存在的对象创建一个新对象,而不用使用new关键字。
Object.create(obj,propertiesObject)方法基于一个已经存在的对象作为新创建对象的原型。
复制代码
使用Object.create()方法创建对象,只需要记住它需要传入两个参数。
obj:第一个参数可以是任意一个对象,该对象作为新创建对象的原型。
propertiesObject:第二个参数是可选参数,类型是对象,该对象包含向新创建对象添加的属性。
该参数对象是一组属性与值,该对象的属性名称将是新创建的对象的属性名称,值是属性描述符(这些属性描述符的结构与Object.defineProperties()的第二个参数一样)。注意:该参数对象不能是 undefined,另外只有该对象中自身拥有的可枚举的属性才有效,也就是说该对象的原型链上属性是无效的。
假设有一个班级对象Class:
var classObj = { className: "一班", studentNum: 100 }
现在想为这个班级创建一个学生,可以使用如下方式:
var studentObj = Object.create(classObj, { studentName: { value: "小明" }, studentAge: { value: 29 } })
注意:第二个参数的写法是一个对象。
总结:使用Object.create()是将对象继承到__proto__属性上。
四、使用Object.assign()方法创建对象
假如我们想创建一个拥有一个以上对象的所有属性的新对象,Object.assign()方法可以实现这种目的。
Object.assign()方法用来将一个或多个源对象的所有可枚举的属性拷贝到一个目标对象中。
复制代码
Object.assign()可以接受任意数量的对象作为参数。第一个参数是他即将创建,并且返回的参数。其余传入的对象参数,被用来将属性复制到新对象中。
假设有如下两个对象:
var orgObj = { company: "Baidu" }; var carObj = { carName: "Kayan" };
现在需要一个在Baidu公司开着Kayan的员工,可以使用如下方式创建对象:
var employee = Object.assign({}, carObj, orgObj);
consoloe.log(employee);//{carName: "Kayan", company: "Baidu"}
五、单例的方式创建对象
singleton(单例)方法创建对象
代码如下:
var person = new function(){ this.name = "tudouya" };
六、使用ES6 class创建对象
使用ES6 class创建对象与使用用户定义的函数构造器创建对象方法类似。构造器函数被类替代,因为它遵循ES6规范。
示例如下:
class Person { constructor(firstName, lastName) { this.firstName = firstName this.lastName = lastName } }; var person = new Person("muzidigbig", "Lee");