成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JavaScript之 new 命令

desdik / 2255人閱讀

摘要:命令執(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 命令

3.1 基本用法

3.1.1 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;
3.1.2 保證構(gòu)造函數(shù)必須與 new 命令一起使用

如果忘了使用 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

3.2 new 命令的原理

使用 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)造”為需要的樣子。

3.2.1 關(guān)于 return語句

如果構(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 對象。
3.2.2 對普通函數(shù)使用 new

如果對普通函數(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

相關(guān)文章

  • 溫故知新javascript面向?qū)ο?/b>

    摘要:應(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語言的對象體系,不是基于類的,...

    趙連江 評論0 收藏0
  • 再遇設(shè)計模式JavaScript

    摘要:在面向?qū)ο蟮恼Z言中,比如,等,單例模式通常是定義類時將構(gòu)造函數(shù)設(shè)為,保證對象不能在外部被出來,同時給類定義一個靜態(tài)的方法,用來獲取或者創(chuàng)建這個唯一的實例。 萬事開頭難,作為正經(jīng)歷菜鳥賽季的前端player,已經(jīng)忘記第一次告訴自己要寫一些東西出來是多久以的事情了。。。如果,你也和我一樣,那就像我一樣,從現(xiàn)在開始,從看到這篇文章開始,打開電腦,敲下你的第一篇文章(或者任何形式的文字)吧。 ...

    Clect 評論0 收藏0
  • 細(xì)談JavaScript中的一些設(shè)計模式

    摘要:注意事項聲明函數(shù)時候處理業(yè)務(wù)邏輯區(qū)分和單例的區(qū)別,配合單例實現(xiàn)初始化構(gòu)造函數(shù)大寫字母開頭推薦注意的成本。簡單工廠模式使用一個類通常為單體來生成實例。 @(書籍閱讀)[JavaScript, 設(shè)計模式] 常見設(shè)計模式 一直對設(shè)計模式不太懂,花了一下午加一晚上的時間,好好的看了看各種設(shè)計模式,并總結(jié)了一下。 設(shè)計模式簡介 設(shè)計模式概念解讀 設(shè)計模式的發(fā)展與在JavaScript中的應(yīng)用 ...

    30e8336b8229 評論0 收藏0
  • JS原型與原型鏈

    摘要:因此,就會形成一個原型鏈對象到原型,再到原型的原型如果一層層地上溯,所有對象的原型最終都可以上溯到,即構(gòu)造函數(shù)的屬性。 對于很多前端開發(fā)者而言,JavaScript中原型與原型鏈?zhǔn)且粋€比較容易疑惑的點(diǎn),所以本文記錄了自己對應(yīng)這方面的一點(diǎn)理解,以后有更深的理解再來更新。 對象 想要了解原型與原型鏈,首先要了解什么是對象?面向?qū)ο缶幊蹋∣bject Oriented Programmin...

    Fourierr 評論0 收藏0
  • 在 Laravel 項目中使用 Glup Laravel-Elixir

    摘要:結(jié)果會被存放到拷貝文件目錄你可以使用方法拷貝文件目錄到新路徑,所有操作都相對于項目根目錄版本號緩存刷新很多開發(fā)者會給編譯的前端資源添加時間戳或者唯一令牌后綴以強(qiáng)制瀏覽器加載最新版本而不是代碼的緩存副本。 環(huán)境準(zhǔn)備 1、安裝 nodejs 和 npm ?如果你使用的是 Laravel 的 Homestead 環(huán)境,可以不用安裝了,已自帶。 ?我們來查看下它們的版本: $ node -v ...

    ralap 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<