Javascript创建对象的几种方式?
javascript 中常見的創(chuàng)建對象的幾種方式:
?1.?使用Object構(gòu)造函數(shù)創(chuàng)建;
使用Object構(gòu)造函數(shù)來創(chuàng)建一個對象,下面代碼創(chuàng)建了一個person對象,并用兩種方式打印出了Name的屬性值。
var person = new Object(); person.name="kevin"; person.age=31; alert(person.name); alert(person["name"])2. 使用對象字面量創(chuàng)建一個對象;
var person ={name:"Kevin",age:31,5:"Test" }; alert(person.name); alert(person["5"]);3. 使用工廠模式創(chuàng)建對象;
返回帶有屬性和方法的person對象。
function createPerson(name, age,job){var o = new Object();o.name=name;o.age=31;o.sayName=function(){alert(this.name);};return o;
}
createPerson("kevin",31,"se").sayName();
用函數(shù)來封裝以特定接口創(chuàng)建對象的細(xì)節(jié),解決了創(chuàng)建多個相似對象的問題,但是沒有解決對象識別的問題(怎么知道一個對象的類型)。
4. 使用自定義構(gòu)造函數(shù)模式創(chuàng)建對象;
這里注意命名規(guī)范,作為構(gòu)造函數(shù)的函數(shù)首字母要大寫,以區(qū)別其它函數(shù)。這種方式有個缺陷是sayName這個方法,它的每個實例都是指向不同的函數(shù)實例,而不是同一個。構(gòu)造函數(shù)模式,構(gòu)造函數(shù)添加屬性和方法,使用的時候new一個自定義的對象
function Person(name,age,job) {this.name=name;this.age=age;this.job=job;this.sayName=function(){alert(this.name);}; }var person = new Person("kevin",31,"SE"); person.sayName();
new一個構(gòu)造函數(shù)的內(nèi)部操作步驟:
1)、創(chuàng)建一個新對象;
2)、將構(gòu)造函數(shù)的作用域賦給新對象(因此this就指向了這個新對象);
3)、執(zhí)行構(gòu)造函數(shù)中的代碼;
4)、返回新對象。
使用構(gòu)造函數(shù)創(chuàng)建的實例,都會有一個constructor屬性,指向構(gòu)造函數(shù)。
創(chuàng)建自定義的構(gòu)造函數(shù)意味著將來可以將它的實例標(biāo)識為一種特定的類型。這正是勝過工廠模式的地方。
與普通函數(shù)的區(qū)別在于new調(diào)用,不用new來調(diào)用,與普通函數(shù)無差。
不使用new調(diào)用的時候,就相當(dāng)于window調(diào)用了構(gòu)造函數(shù),屬性和方法都被添加到了window對象上去。
也可以這樣使用:(call就是為了改變上下文環(huán)境而生)
var o = new Object(); Person.call(o,"Dadaoshenyi",25,"Enginner"); o.sayName();//"Dadaoshenyi"構(gòu)造函數(shù)創(chuàng)建對象的問題:每個方法都要在實例上重寫一遍。由于函數(shù)也是對象,因此每次定義一個函數(shù),也就實例化了一個對象。
5. 使用原型模式創(chuàng)建對象;
解決了方法4中提到的缺陷,使不同的對象的函數(shù)(如sayFriends)指向了同一個函數(shù)。
但它本身也有缺陷,就是實例共享了引用類型friends,從下面的代碼執(zhí)行結(jié)果可以看到,兩個實例的friends的值是一樣的,這可能不是我們所期望的。原型模式,定義構(gòu)造函數(shù),構(gòu)造函數(shù)原型上添加屬性和方法。?
function Person(){}Person.prototype = {constructor : Person,name:"kevin",age:31,job:"SE",friends:["Jams","Martin"],sayFriends:function(){alert(this.friends);} }; var person1 = new Person(); person1.friends.push("Joe"); person1.sayFriends();//Jams,Martin,Joe var person2 = new Person(); person2.sayFriends();//James,Martin,Joe構(gòu)造函數(shù)的原型||對象實例的內(nèi)部指針([[Prototype(__proto__)]]指向Person.prototype)。
實例對象的內(nèi)部指針指向構(gòu)造函數(shù)的原型。
原型模式的優(yōu)點:自定義的構(gòu)造函數(shù),可以讓所有的對象實例共享原型對象所包含的屬性和方法。原生的引用類型也是采用這種模式。
問題在于:1、省略了構(gòu)造函數(shù)傳遞參數(shù)的步驟。2、所有實例共享方法和屬性,這樣,實例修改原來的屬性或者方法,將會在所有的實例上表現(xiàn)出來。被捆綁到了一起。只是一個引用,不是一個副本。
6. 組合使用原型模式和構(gòu)造函數(shù)創(chuàng)建對象;
解決了方法5中提到的缺陷,而且這也是使用最廣泛、認(rèn)同度最高的創(chuàng)建對象的方法。組合使用構(gòu)造函數(shù)模式和原型模式,最常用的一種模式。?
function Person(name,age,job) {this.name=name;this.age=age;this.job=job;this.friends=["Jams","Martin"]; } Person.prototype.sayFriends=function() {alert(this.friends); };
// Person.prototype = { // constructor: Person, // sayFriends: function() { // alert(this.friends); // } // }; var person1 = new Person("kevin",31,"SE"); var person2 = new Person("Tom",30,"SE"); person1.friends.push("Joe"); person1.sayFriends();//Jams,Martin,Joe person2.sayFriends();//Jams,Martin
優(yōu)點:使用構(gòu)造函數(shù)來創(chuàng)建實例屬性,且可以修改設(shè)定的值。使用原型創(chuàng)建共享方法和共享的屬性。最大限度的節(jié)省了內(nèi)存。
7. 動態(tài)原型模式;
這個模式的好處在于看起來更像傳統(tǒng)的面向?qū)ο缶幊?#xff0c;具有更好的封裝性,因為在構(gòu)造函數(shù)里完成了對原型創(chuàng)建。這也是一個推薦的創(chuàng)建對象的方法。動態(tài)原型模式,將上面的對象原型方法||屬性的創(chuàng)建方法哦了構(gòu)造函數(shù)里面完成。具有更好的封裝性。結(jié)果是一樣的。?
function Person(name,age,job) {//屬性this.name=name;this.age=age;this.job=job;this.friends=["Jams","Martin"];//方法if(typeof this.sayName != "function"){Person.prototype.sayName=function(){alert(this.name);};Person.prototype.sayFriends=function(){alert(this.friends);};} }var person = new Person("kevin",31,"SE"); person.sayName(); person.sayFriends();另外還有兩個創(chuàng)建對象的方法,寄生構(gòu)造函數(shù)模式和穩(wěn)妥構(gòu)造函數(shù)模式。由于這兩個函數(shù)不是特別常用,這里就不給出具體代碼了。
寫了這么多創(chuàng)建對象的方法,其實真正推薦用的也就是方法6和方法7。當(dāng)然在真正開發(fā)中要根據(jù)實際需要進(jìn)行選擇,也許創(chuàng)建的對象根本不需要方法,也就沒必要一定要選擇它們了。
?
轉(zhuǎn)載于:https://www.cnblogs.com/changyangzhe/p/5721968.html
總結(jié)
以上是生活随笔為你收集整理的Javascript创建对象的几种方式?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 五大常用算法
- 下一篇: 花花酱leetcode 题目——搜索专题