var person = new Object(); person.name = "你好"; person.age = 29; person.job = "software Engineer"; person.sayName = function(){ alert(this.name); }
缺点: 使用同一个接口建立不少对象,会产生大量的重复代码。javascript
function creatPerson(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(this.name); } return o; } var person1 = createPerson("nn",30,"程序员"); var person2 = createPerson("bb",45,"boss"); person1.sayName(); // 程序员
优势: 能够解决上个建立多个类似对象的问题。html
缺点: 没法解决对象识别的问题java
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.sayName = function(){ alert(this.name); } } var person1 = new Person("Nicholes",34,"Software Engineer"); person1.sayName(); //Nicholes
优势: 自定义的构造函数意味着未来能够将它的实例标识为某一种特定的类型;换句话说就是能够识别对象类型。程序员
缺点: 每一个方法都要在每一个实例上从新建立一遍,浪费内存空间。函数
function Person(){} Person.prototype.name = "你好"; Person.prototype.age = 23; Person.prototype.sayName = function(){ alert(this.name); } var person1 = new Person(); person1.sayName(); //你好
优势: 具备封装性,经过构造函数建立的实例能够共享原型对象上的属性和方法。
缺点: 没有私有属性和方法this
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.friends = []; } Person.prototype.sayName=function(){ alert(this.name); } var person1 = new Person("Nichloas",45,"公务员"); var person2 = new Person("hh",45,"程序员"); person1.friends.push("nij"); person2.friends.push("jiek"); alert(person1.friends); //nij alert(person2.friends); //jiek
优势: 构造函数用于定义实例的私有属性,而原型对象用于定义共有属性和方法,这样即最大的节省了内存空间,又区别于其余实例对象。prototype
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; //方法 if(typeof this.sayName != "function"){ Person.prototype.sayName=function(){ alert(this.name); } } } var person = new Person('nh', 19, 'gcs');
优势: 为了适应那些常常使用OO开发语言的人code
结构和工厂模式同样,可是包裹在外面的函数,是构造函数须要 new 一个实例htm
function creatPerson(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(this.name); } return o; } var person1 = new createPerson("nn",30,"程序员");
优势: 能够在特殊状况下用来为对象建立构造函数对象
相似于寄生构造函数,可是不直接把参数赋值给对象。
function creatPerson(name,age,job){ var o = new Object(); o.sayName = function(){ alert(name); } return o; } var person1 = new createPerson("nn",30,"程序员"); console.log( person1.name ) // undefined
优势:外部没法经过实例对象访问到里面的 属性值。
建立对象的方式大概就这些,其中最经常使用的也是默认的方式是组合模式。其它模式各有优缺点。
固然,对于原型模式可能有些人不理解,能够去看 《javascript 高级程序》里面讲解的很清楚,也能够看个人博文
理解原型对象-构造器和实例的关系