JS中构造函数与new操作符

来源:互联网 发布:js onclick this 编辑:程序博客网 时间:2024/06/08 06:18

function Person(name,age){

      this.name=name;

      this.age=age;

      this.sayName=function(){

           alert(this.name);

}}

var person1=new Person("Bob",29);

var person2=new Person("Mary",18);

可以观察到:

a.Person方法中没有显示的创建对象;

b.直接将属性名和方法赋给了this对象;

c.没有return语句。

要创建Person新实例,必须使用new操作符。以这种方式调用构造函数会经历以下4个步骤:

a.创建一个新对象;

b.将构造函数作用域赋给新对象(因此this指向这个新对象);

c.执行构造函数的代码(为这个新对象添加属性);

d.返回新对象。

person1和person2中分别保存着person的一个不同实例。这两个对象都有一个constructor(构造函数)属性。该属性指向Person。(有关constructor等原型链的概念,可参见另一篇博文http://blog.csdn.net/u010267996/article/details/70049493)

alert(person1.constructor==person); //true

alert(person2.constructor==person); //true

---------------------------------------------------------------------------------------------

按照javascript语言精粹中所说,如果在一个函数前面带上new来调用该函数,那么将创建一个隐藏连接到该函数的prototype成员的新对象,同时this将被绑定到那个新对象上。这个话很抽象,我想用实例来让自己加深理解。

1.如果就一个函数,没有返回值,没有prototype成员,然后使用new,会是什么结果呢?

如果一个函数没有返回值,那么如果不使用new来创建变量,那么该变量的值为undefined.

如果用了new,那么就是Object.说明一个函数的默认的Prototype是Object.

复制代码
function Test1(str) {    this.a = str;}var myTest = new Test1("test1");alert(myTest); //[object Object]function Test1WithoutNew(str) {    this.a = str;}var myTestWithoutNew = Test1WithoutNew("test1");alert(myTestWithoutNew); //undefined;
复制代码

2.如果函数有返回值,但是返回值是基本类型。那么new出来的myTest还是object.

因为基本类型的prototype还是Object. 而如果不使用new,那么返回值就是string的值。

复制代码
function Test1(str) {    this.a = str;    return this.a;}var myTest = new Test1("test1");alert(myTest); //Objectfunction Test1WithoutNew(str) {    this.a = str;    return this.a;}var myTestWithoutNew = Test1WithoutNew("test1");alert(myTestWithoutNew); //"test1"
复制代码

3。如果函数的返回值为new出来的对象,那么myTest的值根据new出来的对象的prototype而定。

function Test1(str) {    this.a = str;    return new String(this.a);}var myTest = new Test1("test1");alert(myTest); //String "test1"