JavaScript中幾乎一切都是對象:創建對象的三種方式


全文共1990字,預計學習時長11分鐘

 圖源:unsplash

Javascript中的一切幾乎都是對象,無論是數組還是函數。本文將教你使用JavaScript創建對象的三種方法。

對象字面量

JavaScript對象字面量是指用大括號括起來的用逗號分隔的名稱——值對列表。對象字面量用於封裝代碼並將其包裝在有序的包中。

let Person = {  name: "Foziya",  age: 20,  action: ["walk", " run"],  greeting: function() {    console.log("Hello");  }};

對象字面量的屬性值可以是任何數據類型,包括數組字面量、函數字面量和嵌套對象字面量。

 

let shape = {  name: "rectangle",  color: "red",  size: {    length: 10,    breadth: 20  }}; console.log(shape); // { name: rectangle , // color:  red , // size: { length:10, breadth: 20 } } console.log(shape.size.length)// 10

簡寫屬性名稱

假設必須將不同的變量放在一個對象內,有一種方法是:

let one = 1;let two = 2;let three = 3; let numbers = {  one: one,  two: two,  three: three};console.log(numbers); //{ one: 1, two: 2, three: 3 }

使用ECMAScript 2015,可通過較短的表示法實現相同的目的:

let one = 1;let two = 2;let three = 3; let numbers = { one, two, three }; console.log(numbers);//{ one: 1, two: 2, three: 3 } console.log(numbers.one)// 1 console.log(numbers.one === { one }.one);// true

用戶定義的構造函數

你也可以使用函數在JavaScript中創建對象。仔細想,其實它們本身已經是對象了,因此對象用於創建更多對象。

通常,此方法優於對象構造函數。試想必須創建數百個具有相同屬性的對象,使用對象構造函數方法,必須手動將所有屬性添加到所有對象,但是使用構造函數可以預定義這些屬性。

functionmovies(name, releaseYear, genre, ratings) {  this.name = name;  this.releaseYear =releaseYear;  this.genre = genre;  this.ratings =ratings;  this.watch = () => {    console.log("WatchOnline");  };} let DPS = new movies("Dead Poets Society", 1989, ["Drama", "Teen"], {  IMDb: "8.1 /10",  Metacritic: "79%"}); console.log(DPS);movies {//     name:  Dead Poets Society ,//         releaseYear: 1989,//             genre: [ Drama , Teen ],//                 ratings: { IMDb: 8.1 / 10 , Metacritic:  79%  },//     watch: [Function]// }  let rocky = new movies("Rocky", 1976, ["Drama", "Sports"], {  IMDb: "8.1 /10",  Metacritic: "70%"}); console.log(rocky); // movies {//     name:  Rocky ,//         releaseYear: 1976,//             genre: [ Drama , Sports ],//                 ratings: { IMDb: 8.1 / 10 , Metacritic:  70%  },//     watch: [Function]// }

使用相同的構造函數,可以創建任意數量的對象。

 

重複的屬性名稱

如果兩個屬性使用相同的名稱,則第二個屬性將覆蓋第一個屬性。

let Person = {  name: "NeyVatsa",  name: "Shashank"};console.log(Person.name); // Shashank

New關鍵字

對象構造函數爲給定值創建一個對象封裝器。如果該值不存在或未定義,它將創建並返回至一個空對象。否則的話,它將返回至一個與給定值類型一致的對象。

 

也可以使用new關鍵字創建對象。使用Javascript中的內置對象構造函數,創建一個新的空對象;或者,此關鍵字可以與用戶定義的構造函數一起使用。首先來看一個例子:

 

let movies = newObject(); console.log(movies)//{}

下一步是向此空對象添加屬性和方法,可通過簡單的點標記來實現:

let movies = newObject(); console.log(movies)//{} movies.name = "Dead Poets Society";movies.releaseYear = 1989;movies.genre = ["Drama", "Teen"];movies.ratings = {  IMDb: "8.1 /10",  Metacritic: "79%"};movies.watch = () => {  console.log("WatchOnline");}; console.log(movies);// { name:  Dead Poets Society ,//  releaseYear: 1989,//  genre: [  Drama ,  Teen  ],//  ratings: { IMDb:  8.1 / 10 ,Metacritic:  79%  },//  watch: [Function] } movies.watch();// Watch Online

但我不建議這種做法,因爲後臺有作用域解析,可以檢查構造函數是內置的還是用戶定義的。

使用ES6類創建對象

此方法與通過用戶定義的構造函數使用new關鍵字非常類似。類是面向對象編程(OOP)的主要組件,可以創建實際上是對象的許多類實例。在ES6規範的支持下,現在可以用類替換構造函數。

 

classMovies {  constructor(name,releaseYear, genre, ratings) {    this.name = name;    this.releaseYear = releaseYear;    this.genre = genre;    this.ratings =ratings;  }  watch() {    console.log("WatchOnline");  }}let rocky = new Movies("Rocky", 1976, ["Drama", "Sports"], {  IMDb: "8.1 /10",  Metacritic: "70%"});console.log(rocky);// Movies {//     name:  Rocky ,//         releaseYear: 1976,//             genre: [ Drama , Sports ],//                 ratings: { IMDb: 8.1 / 10 , Metacritic:  70%  }// } rocky.watch();//Watch Online

上面示例中,我已經定義了構造函數中的所有參數。方法可以是類的一部分,而聲明可以稍後添加到類的創建實例中,成爲“對象”:

/*above example*/rocky.buy = function() {  console.log("Buy theMovie");};rocky.buy();// Buy the Movie

而這裏方法是對象的一部分,不會影響原始類。

 

圖源:unsplash

在JavaScript這一基於原型的繼承語言中,類和構造函數都模仿面向對象的繼承模型。熟悉類非常有幫助,React這樣的流行JavaScript庫會經常使用類句法。

 

你掌握了嗎?


推薦閱讀專題

留言點贊發個朋友圈

我們一起分享AI學習與發展的乾貨

編譯組:梁晶晶、陳楓

相關鏈接:

https://hackernoon.com/three-different-ways-to-create-objects-in-javascript-f72b3w6d

如轉載,請後臺留言,遵守轉載規範

推薦文章閱讀

ACL2018論文集50篇解讀

EMNLP2017論文集28篇論文解讀

2018年AI三大頂會中國學術成果全鏈接

ACL2017論文集:34篇解讀乾貨全在這裏

10篇AAAI2017經典論文回顧

長按識別二維碼可添加關注

讀芯君愛你

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章