Fork me on GitHub
代码改变世界

new操作符做了什么??

2015-09-08 16:06  autrol  阅读(567)  评论(0编辑  收藏  举报

在javascript中,new操作符随处可见,我讲一下我自己对new操作符的理解。。。

构造函数无返回值

//测试代码
function Foo(name) {
    var age = 20;
    this.name = name;
}

Foo.prototype.getName = function() {
    return this.name;
}

var foo = new Foo("Jack");

console.log(foo.age);         //undefined
console.log(foo.name);        //Jack
console.log(foo.getName());   //Jack

new的具体过程(借用大神的代码):

function internalConstructor(parameters ) {
    O = new Object();           //new一个空对象
    O.[[Class]] = "Object";     //类型是Object

    //如果F.prototype是Object,O.[[Ptototype]](也就是O.__proto__)为F.prototype,否则为Object.prototype
    O.[[Prototype]] = Type(F. prototype) === 'Object' ?
    F.prototype : Object.prototype;    
   
   //在对象O的作用域下,执行F.[[call]] 函数,能够复制构造函数的this属性到实例对象
    R = F.[[Call]].apply(O, parameters);
   
    //如果R是Object,则返回R,否则返回O,也就是说构造函数存在this相关属性,则返回R,无this相关属性,直接返回O  
    return Type(R) === 'Object' ? R : O;
}

 

构造函数存在返回值

1、如果返回(return)一个原始类型(无 return 时其实为return原始类型undefined),那么就返回new创建的匿名对象

//测试代码
function Foo(name) {
    var age = 20;
    this.name = name;
    return 1;
}

Foo.prototype.getName = function() {
    return this.name;
}

var foo = new Foo("Jack");

console.log(foo.age);         //undefined
console.log(foo.name);        //Jack
console.log(foo.getName());   //Jack

2、只要new表达式之后的构造函数返回(return)一个引用对象(数组,对象,函数等),都将覆盖new创建的匿名对象

//测试代码
function Foo(name) {
    var age = 20;
    this.name = name;
    return {};
}

Foo.prototype.getName = function() {
    return this.name;
}

var foo = new Foo("Jack");

console.log(foo);             //Object {}
console.log(foo.age);         //undefined
console.log(foo.name);        //undefined
console.log(foo.getName());   //Uncaught TypeError: foo.getName is not a function

正常的构造函数是没有返回值的,如果有返回值的话,直接执行构造函数获得返回值就行,也就没必要new了。。。。。。。