亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

javascript創(chuàng)建對(duì)象

Keven / 538人閱讀

摘要:就是通過(guò)調(diào)用構(gòu)造函數(shù)而創(chuàng)建的那個(gè)對(duì)象實(shí)例的原型對(duì)象。與寄生構(gòu)造函數(shù)模式類似,使用穩(wěn)妥構(gòu)造函數(shù)模式創(chuàng)建的對(duì)象與構(gòu)造函數(shù)之間也沒(méi)有什么關(guān)系,因此操作符對(duì)這種對(duì)象也沒(méi)有什么意義

雖然Object構(gòu)造函數(shù)或?qū)ο笞置媪慷伎梢杂脕?lái)創(chuàng)建單個(gè)對(duì)象,但是這些方法有明顯的缺點(diǎn):使用同一個(gè)接口創(chuàng)建很多對(duì)象,會(huì)產(chǎn)生大量重復(fù)代碼。因此人們開(kāi)始使用工廠模式。

工廠模式

這種模式抽象了創(chuàng)建具體對(duì)象的過(guò)程

function createPerson(name,age){
    var o = new Object();
    o.name = name;
    o.age = age;
    o.sayName = function(){
        alert(this.name);
    };
    return o;
}

var person1 = new createPerson("liaojin",18);
var person2 = new createPerson("xiaoguan",20);

函數(shù)createPerson()能夠根據(jù)接受的參數(shù)來(lái)構(gòu)建一個(gè)包含所有必要信息的Person對(duì)象??梢詿o(wú)數(shù)次的調(diào)用這個(gè)函數(shù),而每次它都會(huì)返回一個(gè)包含兩個(gè)屬性以個(gè)方法的對(duì)象。工廠模式雖然解決了創(chuàng)建多個(gè)相似對(duì)象的問(wèn)題,但卻沒(méi)有解決對(duì)象識(shí)別的問(wèn)題(即怎樣知道一個(gè)對(duì)象的類型)。

構(gòu)造函數(shù)模式

使用構(gòu)造函數(shù)將上述例子重寫(xiě)

function Person(name,age){
    this.name = name;
    this.age = age;
    this.sayName = function(){
        alert(this.name);
    };
}

var person1 = new Person("liaojin",18);
var person2 = new Person("xiaoguan",20);

在這個(gè)例子中,Person()函數(shù)取代了createPerson()函數(shù)。注意到Person()中的代碼與createPerson()的不同之處:
1.沒(méi)有顯示的創(chuàng)建對(duì)象
2.直接將屬性和方法賦值給了this對(duì)象
3.沒(méi)有return語(yǔ)句
要?jiǎng)?chuàng)建Person新實(shí)例,必須使用new操作符。這種方式會(huì)經(jīng)理以下四個(gè)步驟:
1.創(chuàng)建一個(gè)新對(duì)象
2.將構(gòu)造函數(shù)的作用域賦給新對(duì)象(因此this就指向了這個(gè)新對(duì)象)
3.執(zhí)行構(gòu)造函數(shù)中的代碼(為這個(gè)新對(duì)象添加屬性)
4.返回新對(duì)象
person1和person2分別保存著Person的一個(gè)不同實(shí)例。這兩個(gè)對(duì)象都有一個(gè)constructor屬性,該屬性指向Person。

alert(person1.constructor == Person);//true
alert(person2.constructor == Person);//true

對(duì)象的constructor屬性最初是用來(lái)表示對(duì)象類型的,但是檢測(cè)對(duì)象類型還是instanceof更可靠一些。這個(gè)例子中創(chuàng)建的所有對(duì)象即是Object的實(shí)例,同時(shí)也是Person的實(shí)例。
創(chuàng)建自定義的構(gòu)造函數(shù)意味著將來(lái)可以將它的實(shí)例標(biāo)識(shí)為一種特定的類型;person1和person2之所以同時(shí)是Object的實(shí)例,是因?yàn)樗袑?duì)象均繼承自O(shè)bject.

將構(gòu)造函數(shù)當(dāng)做函數(shù)

構(gòu)造函數(shù)與其他函數(shù)唯一的區(qū)別就在于調(diào)用他們的方式不同。
任何函數(shù)只要通過(guò)new操作符來(lái)調(diào)用,那他就可以作為構(gòu)造函數(shù);而任何函數(shù)如果不通過(guò)new操作符來(lái)調(diào)用,那他跟普通函數(shù)沒(méi)有區(qū)別。
如上述例子中的Person()函數(shù)可以通過(guò)下列任何一種方式來(lái)調(diào)用。

//當(dāng)做構(gòu)造函數(shù)調(diào)用
var person = new Person("liaojin",18);
person.sayName();//liaojin

//作為普通函數(shù)調(diào)用
Person("lihua",12);
window.sayName();//lihua

//在另一個(gè)對(duì)象的作用域調(diào)用
var o = new Object();
Person.call(o,"xiaoguan",20);
o.sayName();//xiaoguan
構(gòu)造函數(shù)的問(wèn)題

構(gòu)造函數(shù)模式雖然好用,但是也有缺點(diǎn)。使用構(gòu)造函數(shù)的主要問(wèn)題,就是每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一遍。如同this.sayName =new function(){alert(this.name);};在上面的構(gòu)造函數(shù)中sayName()的方法,person1和person2雖然都調(diào)用了這個(gè)方法,但是調(diào)用的并不是同一個(gè)Function實(shí)例。因此不同實(shí)例的同名函數(shù)是不相等的

alert(person1.sayName == person2.sayName);//false

然而創(chuàng)建兩個(gè)完成同樣任務(wù)的Function實(shí)例的確沒(méi)有必要;因此可以通過(guò)吧函數(shù)定義轉(zhuǎn)移到構(gòu)造函數(shù)外部來(lái)解決這個(gè)問(wèn)題

function Person(name,age){
    this.name = name;
    this.age = age;
    this.sayName = sayName;
}
function sayName(){
    alert(this.name);
}
var person1 = new Person("liaojin",18);
var person2 = new Person("xiaoguan",20);

在構(gòu)造函數(shù)內(nèi)部,我們將sayName屬性設(shè)置為指向全局的sayName函數(shù),由于sayName包含的是指向函數(shù)的指針,person1,person2共享了一個(gè)sayName函數(shù),解決了兩個(gè)函數(shù)做同樣一件事的問(wèn)題。
可是隨即有產(chǎn)生了新的問(wèn)題:在全局作用域定義的函數(shù)實(shí)際上只能被某個(gè)對(duì)象調(diào)用,這讓全局函數(shù)優(yōu)點(diǎn)名不副實(shí)。如果對(duì)象需要定義很多方法,那么就需要定義多個(gè)全局函數(shù),于是自定義的引用類型就沒(méi)有封裝性可言了,因此產(chǎn)生了原型模式。

原型模式

我們所創(chuàng)建的每個(gè)函數(shù)都有一個(gè)prototype屬性,這個(gè)屬性是一個(gè)指針,指向一個(gè)對(duì)象,而這個(gè)對(duì)象的用途就是包含可以由特定類型的所有實(shí)例共享的屬性和方法。prototype就是通過(guò)調(diào)用構(gòu)造函數(shù)而創(chuàng)建的那個(gè)對(duì)象實(shí)例的原型對(duì)象??梢宰屗袑?duì)象的實(shí)例共享它所包含的屬性和方法。

function Person(){}
Person.prototype.name = "liaojin";
Person.prototype.age = 18;
Person.prototype.sayName = function(){
    alert(this.name);
};

var person1 = new Person();
Person1.sayName();//liaojin
var person2 = new Person();
Person2.sayName();//liaojin

alert(person1.sayName == person2.sayName);//true
組合使用構(gòu)造函數(shù)模式和原型模式

構(gòu)造函數(shù)用于定義實(shí)例屬性,而原型模式用于定義方法和共享的屬性。這樣每個(gè)實(shí)例都會(huì)有自己的實(shí)例屬性的副本,但同時(shí)又共享著對(duì)方法的引用,最大限度地節(jié)省了內(nèi)存。

function Person(name,age){
    this.name = name;
    this.age = age;
    this.friends = ["lucy","lily"];
}

Person.prototype = {
    constructor:Person,
    sayName:function(){
        alert(this.name);
    }
}
var person1 = new Person("liaojin",18);
var person2 = new Person("xiaoguan",20);

person1.friends.push("lihua");
alert(person1.friends);//lucy,lily,lihua
alert(person2.friends);//lucy,lily
alert(person1.friends == person2.friends);//false
alert(person1.sayName == person2.sayName);//true
動(dòng)態(tài)原型模式

有其他面向?qū)ο蠼?jīng)驗(yàn)開(kāi)發(fā)的人員看到獨(dú)立的構(gòu)造函數(shù)和原型時(shí),很可能會(huì)肥腸困惑,動(dòng)態(tài)原型模式就是解決這個(gè)問(wèn)題的一個(gè)方案。

function Person(name,age){
    this.name = name;
    this.age = age;
}
if(typeof this.sayName != "function"){
    Person.prototype.sayName = function(){
        alert(this.name);
    };
}

這里只在sayName()方法不存在的情況下才會(huì)將它添加到原型中。這段代碼只會(huì)在初期調(diào)用才會(huì)執(zhí)行。

寄生構(gòu)造函數(shù)模式

這個(gè)模式可以在特殊的情況下用來(lái)為對(duì)象創(chuàng)建構(gòu)造函數(shù)。假設(shè)我們想創(chuàng)建一個(gè)具有額外方法的特殊數(shù)組。由于不能直接修改Array構(gòu)造函數(shù),因此可以使用這個(gè)模式。

function SpecialArray(){
    var values = new Array();
    values.push.apply(values,arguments);
    values.toPipedString = function(){
        return this.join("|");
    };
    return values;
}
var colors = new SpecialArray["red","blue","green"];
alert(colors.toPipedString());//red|blue|green

說(shuō)明:關(guān)于寄生構(gòu)造函數(shù)模式,首先返回的對(duì)象與構(gòu)造函數(shù)或者與構(gòu)造函數(shù)的原型屬性之間沒(méi)有關(guān)系;構(gòu)造函數(shù)返回的對(duì)象與在構(gòu)造函數(shù)外部創(chuàng)建的對(duì)象沒(méi)有什么不同。因此不能依賴instanceof操作符來(lái)確定對(duì)象的類型。

穩(wěn)妥構(gòu)造函數(shù)模式

所謂穩(wěn)妥對(duì)象,指的是沒(méi)有公共屬性,而且其方法也不引用this的對(duì)象。穩(wěn)妥對(duì)象最適合在一些安全的環(huán)境中(禁止使用this和new的環(huán)境),或者在防止數(shù)據(jù)被其他應(yīng)用程序改動(dòng)時(shí)使用。與寄生構(gòu)造函數(shù)類似的模式;但有兩點(diǎn)不同:1.新創(chuàng)建對(duì)象的實(shí)例方法不引用this;2.不使用new操作符調(diào)用構(gòu)造函數(shù);

function Person(name,age){
    var o = new Object();
    o.sayName = function(){
    alert(name);
    };
    return o;
}

//使用
var friend = Person("liaojin",18);
friend.sayName();//liaojin

這樣變量person中保存的是一個(gè)穩(wěn)妥對(duì)象,而除了調(diào)用sayName()方法外,沒(méi)有別的方法可以訪問(wèn)其數(shù)據(jù)成員,即使有其他代碼會(huì)給這個(gè)對(duì)象添加方法或數(shù)據(jù)成員,但也不可能有別的辦法訪問(wèn)傳入到構(gòu)造函數(shù)中的原始數(shù)據(jù),非常適合在某些安全執(zhí)行環(huán)境下使用。
與寄生構(gòu)造函數(shù)模式類似,使用穩(wěn)妥構(gòu)造函數(shù)模式創(chuàng)建的對(duì)象與構(gòu)造函數(shù)之間也沒(méi)有什么關(guān)系,因此instanceof操作符對(duì)這種對(duì)象也沒(méi)有什么意義

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/95645.html

相關(guān)文章

  • JavaScript中的面向對(duì)象(object-oriented)編程

    摘要:對(duì)象在中,除了數(shù)字字符串布爾值這幾個(gè)簡(jiǎn)單類型外,其他的都是對(duì)象。那么在函數(shù)對(duì)象中,這兩個(gè)屬性的有什么區(qū)別呢表示該函數(shù)對(duì)象的原型表示使用來(lái)執(zhí)行該函數(shù)時(shí)這種函數(shù)一般成為構(gòu)造函數(shù),后面會(huì)講解,新創(chuàng)建的對(duì)象的原型。這時(shí)的函數(shù)通常稱為構(gòu)造函數(shù)。。 本文原發(fā)于我的個(gè)人博客,經(jīng)多次修改后發(fā)到sf上。本文仍在不斷修改中,最新版請(qǐng)?jiān)L問(wèn)個(gè)人博客。 最近工作一直在用nodejs做開(kāi)發(fā),有了nodejs,...

    JerryZou 評(píng)論0 收藏0
  • [譯] V8 使用者文檔

    摘要:注意句柄棧并不是調(diào)用棧中的一部分,但句柄域卻在棧中。一個(gè)依賴于構(gòu)造函數(shù)和析構(gòu)函數(shù)來(lái)管理下層對(duì)象的生命周期。對(duì)象模板用來(lái)配置將這個(gè)函數(shù)作為構(gòu)造函數(shù)而創(chuàng)建的對(duì)象。 如果你已經(jīng)閱讀過(guò)了上手指南,那么你已經(jīng)知道了如何作為一個(gè)單獨(dú)的虛擬機(jī)使用 V8 ,并且熟悉了一些 V8 中的關(guān)鍵概念,如句柄,域 和上下文。在本文檔中,還將繼續(xù)深入討論這些概念并且介紹其他一些在你的 C++ 應(yīng)用中使用 V8 的...

    lei___ 評(píng)論0 收藏0
  • JavaScript對(duì)象

    摘要:對(duì)象的分類內(nèi)置對(duì)象原生對(duì)象就是語(yǔ)言預(yù)定義的對(duì)象,在標(biāo)準(zhǔn)定義,有解釋器引擎提供具體實(shí)現(xiàn)宿主對(duì)象指的是運(yùn)行環(huán)境提供的對(duì)象。不過(guò)類型是中所有類型的父級(jí)所有類型的對(duì)象都可以使用的屬性和方法,可以通過(guò)的構(gòu)造函數(shù)來(lái)創(chuàng)建自定義對(duì)象。 對(duì)象 javaScript中的對(duì)象,和其它編程語(yǔ)言中的對(duì)象一樣,可以比照現(xiàn)實(shí)生活中的對(duì)象來(lái)理解。在JavaScript中,一個(gè)對(duì)象可以是一個(gè)單獨(dú)擁有屬性和類型的實(shí)體。和...

    xavier 評(píng)論0 收藏0
  • JavaScript基礎(chǔ)之創(chuàng)建對(duì)象、原型、原型對(duì)象、原型鏈

    摘要:在最開(kāi)始的時(shí)候,原型對(duì)象的設(shè)計(jì)主要是為了獲取對(duì)象的構(gòu)造函數(shù)。同理數(shù)組通過(guò)調(diào)用函數(shù)通過(guò)調(diào)用原型鏈中描述了原型鏈的概念,并將原型鏈作為實(shí)現(xiàn)繼承的主要方法。 對(duì)象的創(chuàng)建 在JavaScript中創(chuàng)建一個(gè)對(duì)象有三種方式??梢酝ㄟ^(guò)對(duì)象直接量、關(guān)鍵字new和Object.create()函數(shù)來(lái)創(chuàng)建對(duì)象。 1. 對(duì)象直接量 創(chuàng)建對(duì)象最直接的方式就是在JavaScript代碼中使用對(duì)象直接量。在ES5...

    wangbjun 評(píng)論0 收藏0
  • JavaScript 工廠函數(shù) vs 構(gòu)造函數(shù)

    摘要:當(dāng)談到語(yǔ)言與其他編程語(yǔ)言相比時(shí),你可能會(huì)聽(tīng)到一些令人困惑東西,其中之一是工廠函數(shù)和構(gòu)造函數(shù)。好的,讓我們用構(gòu)造函數(shù)做同樣的實(shí)驗(yàn)。當(dāng)我們使用工廠函數(shù)創(chuàng)建對(duì)象時(shí),它的指向,而當(dāng)從構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí),它指向它的構(gòu)造函數(shù)原型對(duì)象。 showImg(https://segmentfault.com/img/bVbr58T?w=1600&h=900); 當(dāng)談到JavaScript語(yǔ)言與其他編程語(yǔ)言...

    RayKr 評(píng)論0 收藏0
  • JavaScript學(xué)習(xí)筆記(二) 對(duì)象與函數(shù)

    摘要:在中函數(shù)是一等對(duì)象,它們不被聲明為任何東西的一部分,而所引用的對(duì)象稱為函數(shù)上下文并不是由聲明函數(shù)的方式?jīng)Q定的,而是由調(diào)用函數(shù)的方式?jīng)Q定的。更為準(zhǔn)確的表述應(yīng)該為當(dāng)對(duì)象充當(dāng)函數(shù)的調(diào)用函數(shù)上下文時(shí),函數(shù)就充當(dāng)了對(duì)象的方法。 引言:當(dāng)理解了對(duì)象和函數(shù)的基本概念,你可能會(huì)發(fā)現(xiàn),在JavaScript中有很多原以為理所當(dāng)然(或盲目接受)的事情開(kāi)始變得更有意義了。 1.JavaScript...

    jeffrey_up 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<