JavaScript中关于“new”操作符的一些原理

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对象








猜你喜欢

转载自blog.csdn.net/qq_37016928/article/details/80240516