javascript创建对象的方法有很多种,一般来说,推荐使用对象字面量来创建对象。
对象构造函数捕捉
使用new Object来创建对象,可能会带来一些问题:
var o = new Object(); console.log(o.constructor === Object);//true var o = new Object(1); console.log(o.constructor === Object);//false console.log(o.constructor === Number);//true var o = new Object("hi"); console.log(o.constructor === String);//true console.log(typeof o.substring);//'function'
自定义构造函数
使用new创建对象时,首先创建一个空对象,然后将其[[prototype]]指向构造函数的原型对象,然后执行构造函数,将this的属性和方法添加到创建的空对象里面,最后隐形返回这个对象:
var Person = function(){ //var this={}; this.name = "Rose"; this.sayName = function(){ console.log("I am"+this.Name); }; //return this; };
构造函数的返回值:
var Person = function(){ this.name = "Rose"; var that = {}; that.name = "Mary"; return that; }; var person = new Person(); console.log(person.name);//"Mary"
就是说,如果返回的是一个对象,将覆盖默认的对象,但是如果返回的不是对象,而是值,虽然不会造成错误,但是函数会忽略该值。
强制使用new的模式:
有时候,如果忘记使用new,将造成一些错误,为了避免这类错误,可以使用的写法:
var Person = function(nameStr){ var that = {}; that.name = nameStr; return that; }; var girl = new Person("Mary"); console.log(girl.name);//"Mary" var boy = Person("Mike"); console.log(boy.name);//"Mike"