摘要:命令執(zhí)行時,構(gòu)造函數(shù)內(nèi)部的,就代表了新生成的實例對象,表示實例對象有一個屬性,值是。因此,應(yīng)該非常小心,避免不使用命令直接調(diào)用構(gòu)造函數(shù)。命令返回這個對象,而不是對象。
JavaScript 面向?qū)ο缶幊痰幕A(chǔ)知識篇 1 。
1. 概述面向?qū)ο缶幊蹋∣bject Oriented Programming,縮寫為 OOP)是目前主流的編程范式。
那么,“對象”(object)到底是什么?
對象是單個實物的抽象。
對象是一個容器,封裝了屬性(property)和方法(method)。 屬性是對象的狀態(tài),方法是對象的行為(完成某種任務(wù))。
2. 構(gòu)造函數(shù)面向?qū)ο缶幊痰牡谝徊?,就是要生成對象。通常需要一個模板,表示某一類實物的共同特征,然后對象根據(jù)這個模板生成。
JavaScript 語言使用構(gòu)造函數(shù)(constructor)作為對象的模板。 “構(gòu)造函數(shù)”,就是專門用來生成實例對象的函數(shù)。
它就是對象的模板,描述實例對象的基本結(jié)構(gòu)。一個構(gòu)造函數(shù),可以生成多個實例對象,這些實例對象都有相同的結(jié)構(gòu)。
var Vehicle = function () {
this.price = 1000;
};
上面代碼中,Vehicle 就是構(gòu)造函數(shù)。為了與普通函數(shù)區(qū)別,構(gòu)造函數(shù)名字的第一個字母通常大寫。
構(gòu)造函數(shù)的特點(diǎn)有兩個。
函數(shù)體內(nèi)部使用了 this 關(guān)鍵字,代表了所要生成的對象實例。
生成對象的時候,必須使用 new 命令。
3. new 命令new 命令的作用,就是執(zhí)行構(gòu)造函數(shù),返回一個實例對象。
var Vehicle = function () {
this.price = 1000;
};
var v = new Vehicle();
v.price // 1000
上面代碼通過 new 命令,讓構(gòu)造函數(shù) Vehicle 生成一個實例對象,保存在變量 v 中。new 命令執(zhí)行時,構(gòu)造函數(shù)內(nèi)部的this,就代表了新生成的實例對象,this.price 表示實例對象有一個 price 屬性,值是1000。
下面兩行代碼是等價的,但是為了表示這里是函數(shù)調(diào)用,推薦使用括號。
// 推薦的寫法
var v = new Vehicle();
// 不推薦的寫法
var v = new Vehicle;
如果忘了使用 new 命令,直接調(diào)用構(gòu)造函數(shù)會發(fā)生什么事?
var Vehicle = function (){
this.price = 1000;
};
var v = Vehicle();
v // undefined
price // 1000
上面代碼中,調(diào)用 Vehicle 構(gòu)造函數(shù)時,忘了加上 new 命令。結(jié)果,變量 v 變成了 undefined,而 price 屬性變成了全局變量。因此,應(yīng)該非常小心,避免不使用 new 命令、直接調(diào)用構(gòu)造函數(shù)。
為了保證構(gòu)造函數(shù)必須與 new 命令一起使用,有2種解決辦法:
構(gòu)造函數(shù)內(nèi)部使用嚴(yán)格模式,即第一行加上 use strict。 這樣的話,一旦忘了使用 new 命令,直接調(diào)用構(gòu)造函數(shù)就會報錯。
function Fubar(foo, bar){
"use strict";
this._foo = foo;
this._bar = bar;
}
Fubar()
// TypeError: Cannot set property "_foo" of undefined
上面代碼的 Fubar 為構(gòu)造函數(shù),use strict 命令保證了該函數(shù)在嚴(yán)格模式下運(yùn)行。由于嚴(yán)格模式中,函數(shù)內(nèi)部的 this 不能指向全局對象,默認(rèn)等于undefined,導(dǎo)致不加 new 調(diào)用會報錯(JavaScript 不允許對 undefined添加屬性)。
構(gòu)造函數(shù)內(nèi)部判斷是否使用 new 命令,如果發(fā)現(xiàn)沒有使用,則直接返回一個實例對象。
function Fubar(foo, bar) {
if (!(this instanceof Fubar)) {
return new Fubar(foo, bar);
}
this._foo = foo;
this._bar = bar;
}
Fubar(1, 2)._foo // 1
(new Fubar(1, 2))._foo // 1
使用 new 命令時,它后面的函數(shù)依次執(zhí)行下面的步驟。
創(chuàng)建一個空對象,作為將要返回的對象實例。
將這個空對象的原型,指向構(gòu)造函數(shù)的 prototype 屬性。
將這個空對象賦值給函數(shù)內(nèi)部的 this 關(guān)鍵字。
開始執(zhí)行構(gòu)造函數(shù)內(nèi)部的代碼。
也就是說,構(gòu)造函數(shù)內(nèi)部,this 指的是一個新生成的空對象,所有針對 this 的操作,都會發(fā)生在這個空對象上。構(gòu)造函數(shù)之所以叫“構(gòu)造函數(shù)”,就是說這個函數(shù)的目的,就是操作一個空對象(即this對象),將其“構(gòu)造”為需要的樣子。
如果構(gòu)造函數(shù)內(nèi)部有 return 語句,而且 return 后面跟著一個對象,new 命令會返回return 語句指定的對象;否則,就會不管return語句,返回 this 對象。
var Vehicle = function () {
this.price = 1000;
return 1000;
};
(new Vehicle()) === 1000
// false new命令忽略了這個 return 語句,返回“構(gòu)造”后的 this 對象。
如果 return語句返回的是一個跟 this 無關(guān)的新對象,new命令會返回這個新對象,而不是this對象。
var Vehicle = function (){
this.price = 1000;
return { price: 2000 };
};
(new Vehicle()).price
// 2000 new 命令返回這個對象,而不是 this 對象。
如果對普通函數(shù)(內(nèi)部沒有 this 關(guān)鍵字的函數(shù))使用 new 命令,則會返回一個空對象。
function getMessage() {
return "this is a message";
}
var msg = new getMessage();
msg // {}
typeof msg // "object"
這是因為 new 命令總是返回一個對象,要么是實例對象,要么是return 語句指定的對象。本例中,return 語句返回的是字符串,所以new 命令就忽略了該語句。
參考鏈接阮一峰, JavaScript 教程
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/6932.html
摘要:應(yīng)該非常小心,避免出現(xiàn)不使用命令直接調(diào)用構(gòu)造函數(shù)的情況。上面代碼表示,使用屬性,確定實例對象的構(gòu)造函數(shù)是,而不是。當(dāng)然,從繼承鏈來看,只有一個父類,但是由于在的實例上,同時執(zhí)行和的構(gòu)造函數(shù),所以它同時繼承了這兩個類的方法。 基本概念 類和實例是大多數(shù)面向?qū)ο缶幊陶Z言的基本概念 類:類是對象的類型模板 實例:實例是根據(jù)類創(chuàng)建的對象但是,JavaScript語言的對象體系,不是基于類的,...
摘要:在面向?qū)ο蟮恼Z言中,比如,等,單例模式通常是定義類時將構(gòu)造函數(shù)設(shè)為,保證對象不能在外部被出來,同時給類定義一個靜態(tài)的方法,用來獲取或者創(chuàng)建這個唯一的實例。 萬事開頭難,作為正經(jīng)歷菜鳥賽季的前端player,已經(jīng)忘記第一次告訴自己要寫一些東西出來是多久以的事情了。。。如果,你也和我一樣,那就像我一樣,從現(xiàn)在開始,從看到這篇文章開始,打開電腦,敲下你的第一篇文章(或者任何形式的文字)吧。 ...
摘要:注意事項聲明函數(shù)時候處理業(yè)務(wù)邏輯區(qū)分和單例的區(qū)別,配合單例實現(xiàn)初始化構(gòu)造函數(shù)大寫字母開頭推薦注意的成本。簡單工廠模式使用一個類通常為單體來生成實例。 @(書籍閱讀)[JavaScript, 設(shè)計模式] 常見設(shè)計模式 一直對設(shè)計模式不太懂,花了一下午加一晚上的時間,好好的看了看各種設(shè)計模式,并總結(jié)了一下。 設(shè)計模式簡介 設(shè)計模式概念解讀 設(shè)計模式的發(fā)展與在JavaScript中的應(yīng)用 ...
摘要:結(jié)果會被存放到拷貝文件目錄你可以使用方法拷貝文件目錄到新路徑,所有操作都相對于項目根目錄版本號緩存刷新很多開發(fā)者會給編譯的前端資源添加時間戳或者唯一令牌后綴以強(qiáng)制瀏覽器加載最新版本而不是代碼的緩存副本。 環(huán)境準(zhǔn)備 1、安裝 nodejs 和 npm ?如果你使用的是 Laravel 的 Homestead 環(huán)境,可以不用安裝了,已自帶。 ?我們來查看下它們的版本: $ node -v ...
閱讀 2767·2023-04-26 00:07
閱讀 2498·2021-11-15 11:37
閱讀 719·2021-10-19 11:44
閱讀 2241·2021-09-22 15:56
閱讀 1830·2021-09-10 10:50
閱讀 1572·2021-08-18 10:21
閱讀 2669·2019-08-30 15:53
閱讀 1695·2019-08-30 11:11