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 高級程序》裏面講解的很清楚,也能夠看個人博文
理解原型對象-構造器和實例的關係