1.工厂模式
function createPerson(name,age) { var obj = new Object(); obj.name = name; obj.age = age; return obj } var person1= createPerson("p2",21); console.log(person1.name);//p2 console.log(person1.age);//21
2.构造函数中:
function Person(name,age) { this.name = name; this.age = age; } var person = new Person("p1",20); console.log(person.name);//p1 console.log(person.age);//20
在构造函数创建新实例是,必须用new操作符,这种方式会经历以下四个过程:
(1)创建一个新的对象
(2)将构造函数的作用域赋给新创建的对象,(因此this就指向了这个新的对象)
(3)执行构造函数的代码(即为这个对象添加属性)
(4)返回这个新的对象。
虽然是构造函数,但它也是一个函数,只不过可以用来创建对象而已,所以它也可以当作普通函数调用,即不适用” new“操作符:
var person3 = Person("p3",30); console.log(window.name)//p3 console.log(window.age)//30
当它作为普通函数调用时,由于函数在全局环境中被调用,所以里面的this指向的是window,执行完该函数后即为window对象添加了三个属性
3普通函数使用new
之前的工厂模式的函数使用new
var person4 = new createPerson('p4',21); console.log(person4.name);//p4 console.log(person4.age);//21
这样也最终也创建一个实例对象,这是因为new操作符最终总要返回一个对象,这个对象要么是实例对象,要么是return
语句指定的对象或数组,所以即便是普通函数也可以使用new操作符调用,由于这个例子中函数最终返回的是一个对象,所以在使用new操作符后就把该对象返回。如果该函数没有返回值,则会返回一个空对象:
function person(name) { var name = name; } var person5 = new person('p5'); console.log(person5);//person{}
如果一个构造函数内部有return语句,则使用new会返回return指定的对象,如果return语句中返回的不是引用类型而是基本数据类型则会忽略依然返回this对象