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了。。。。。。。