、簡單對象的創建 使用對象字面量的方式{}
創建一個對象(最簡單,好理解,推薦使用),代碼如下
2、用 function(函數)來模擬 class
2.1) 創建一個對象,相當于 new 一個類的實例(無參構造函數),代碼如下
2.2)可以使用有參構造函數來實現,這樣定義更方便,擴展性更強(推薦使用)代碼如下
3、使用工廠方式來創建(Object 關鍵字)
代碼如下:
4、使用原型對象的方式 prototype 關鍵字
代碼如下:
5、混合模式(原型和構造函數)
代碼如下:
6、動態原型的方式(可以看作是混合模式的一種特例)
代碼如下:
以上幾種,是 javascript 中最常用的創建對象的方式
avaScript創立目標的辦法有許多,經過Object結構函數或目標字面量的辦法也能夠創立單個目標,明顯這兩種辦法會產生很多的重復代碼,并不適合量產。接下來介紹七種十分經典的創立目標的辦法,他們也各有優缺陷。
1、工廠辦法
function createPerson(name, job) { var o=new Object()
能夠無數次調用這個工廠函數,每次都會回來一個包括兩個特點和一個辦法的目標
工廠辦法雖然處理了創立多個相似目標的疑問,可是沒有處理目標辨認疑問,即不能知道一個目標的類型
結構函數辦法
function Person(name, job) { this.name=name this.job=job this.sayName=function() { console.log(this.name)
沒有顯現的創立目標,運用new來調用這個結構函數,運用new后會主動履行如下操作
創立一個新目標
這個新目標會被履行[[prototype]]鏈接
這個新目標會綁定到函數調用的this
回來這個目標
運用這個辦法創立目標能夠查看目標類型
person1 instanceof Object // true person1 instanceof Person //true
可是運用結構函數創立目標,每個辦法都要在每個實例上從頭創立一次
2、原型辦法
function Person() {
將信息直接增加到原型目標上。運用原型的優點是能夠讓一切的實例目標同享它所包括的特點和辦法,不用在結構函數中界說目標實例信息。
原型是一個十分重要的概念,在 一篇文章看懂 proto 和prototype的關系及區別 中講的十分具體
3、更簡略的寫法
function Person() {
將Person.prototype設置為等于一個以目標字面量辦法創立的目標,可是會致使 .constructor 不在指向Person了。
運用這種辦法,徹底重寫了默許的Person.prototype目標,因而 .constructor 也不會存在這兒
Person.prototype.constructor===Person // false
假如需求這個特點的話,能夠手動增加
function Person() {
不過這種辦法還是不夠好,應為constructor特點默許是不可枚舉的,這么直接設置,它將是可枚舉的。所以能夠時分,Object.defineProperty辦法
Object.defineProperty(Person.prototype, 'constructor', {
缺陷
運用原型,一切的特點都將被同享,這是個很大的優點,同樣會帶來一些缺陷
原型中一切特點實例是被許多實例同享的,這種同享關于函數十分適宜。關于那些包括基本值的特點也牽強能夠,究竟實例特點能夠屏蔽原型特點??墒且C類型值,就會出現疑問了
function Person() {
friends存在與原型中,實例person1和person2指向同一個原型,person1修正了引證的數組,也會反應到實例person2中
4、動態原型辦法
動態原型辦法將一切信息都封裝在了結構函數中,初始化的時分,經過查看某個應當存在的辦法時分有效,來決議是不是需求初始化原型
function Person(name, job) { // 特點 this.name=name this.job=job // 辦法 if(typeof this.sayName !=='function') {
只需在sayName辦法不存在的時分,才會將它增加到原型中。這段代碼只會初次調用結構函數的時分才會履行。
爾后原型現已完結初始化,不需求在做什么修正了
這兒對原型所做的修正,能夠當即在一切實例中得到反映
其次,if句子查看的可所以初始化以后應當存在的任何特點或辦法,所以不用用一大堆的if句子查看每一個特點和辦法,只需查看一個就行
5、保險結構函數辦法
首要理解保險目標指的是沒有公共特點,并且其辦法也不引證this。
保險目標最適合在一些安全環境中(這些環境會禁止運用this和new),或避免數據被別的應用程序改動時運用
保險結構函數辦法和寄生辦法相似,有兩點不相同:一是創立目標的實例辦法不引證this,而是不運用new操作符調用結構函數
function Person(name, job) { var o=new Object()
和寄生結構函數辦法相同,這么創立出來的目標與結構函數之間沒有什么關系,instanceof操作符對他們沒有意義
6、寄生結構函數辦法
這種辦法的基本思想即是創立一個函數,該函數的效果僅僅是封裝創立目標的代碼,然后再回來新建的目標
function Person(name, job) { var o=new Object()o.name=nameo.job=jobo.sayName=function() { console.log(this.name)} return o} var person1=new Person('Jiang', 'student')person1.sayName()
這個辦法,除了運用new操作符并把運用的包裝函數叫做結構函數以外,和工廠辦法簡直相同
結構函數假如不回來目標,默許也會回來一個新的目標,經過在結構函數的結尾增加一個return句子,能夠重寫調用結構函數時回來的值
7、組合運用結構函數辦法和原型辦法
這是運用最為廣泛、認同度最高的一種創立自界說類型的辦法。它能夠處理上面那些辦法的缺陷
運用此辦法能夠讓每個實例都會有自個的一份實例特點副本,但同時又同享著對辦法的引證
這么的話,即便實例特點修正引證類型的值,也不會影響別的實例的特點值了
function Person(name) { this.name=name this.friends=['Shelby', 'Court']}Person.prototype.sayName=function() { console.log(this.name)} var person1=new Person() var person2=new Person()person1.friends.push('Van') console.log(person1.friends) //["Shelby", "Court", "Van"] console.log(person2.friends) // ["Shelby", "Court"] console.log(person1.friends===person2.friends) //false
如有錯誤請大家及時提出,見諒!!
function Person(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 person=Person("Greg", 27, "Doctor"); person.sayName();// Greg 工廠模式雖然解決了創建多個相似對象的問題,但卻沒有解決對象識別的問題(即不能知道一個對象的類型)
function Person(name, age, job){ this.name=name; this.age=age; this.job=job; this.sayName=function(){ alert(this.name); }; } var person=new Person("Greg", 27, "Doctor"); person.sayName();// Greg 構造函數始終都應該以一個大寫字母開頭,而非構造函數則應該以一個小寫字母開頭
function Person(){ } Person.prototype.name="Nicholas"; Person.prototype.age=29; Person.prototype.job="Software Engineer"; Person.prototype.sayName=function(){ alert(this.name); }; var person=new Person(); person.sayName();//Nicholas 對于原型模式理解就是,每個函數都有一個 prototype(原型)屬性,這個屬性是一個指針,指向一個對象, 而這個對象的用途是包含可以由特定類型的所有實例共享的屬性和方法。
var person=new Object(); person.name="Nicholas"; person.age=29; person.job="Software Engineer"; person.sayName=function(){ alert(this.name); }; person.sayName();//Software Engineer
var person={ name: "Nicholas", age: 29, job: "Software Engineer", sayName: function(){ alert(this.name); } }; person.sayName();//Nicholas
*請認真填寫需求信息,我們會在24小時內與您取得聯系。