Hướng dẫn deep dive javascript - javascript lặn sâu

Hướng dẫn deep dive javascript - javascript lặn sâu

Sử dụng thuật ngữ đơn giản và một ví dụ trong thế giới thực, bài đăng này giải thích

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 là gì và tại sao nó hữu ích.

Đây là cho bạn

Tôi đã nhận thấy rằng nhiều lời giải thích cho

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 trong JavaScript được dạy cho rằng bạn đang đến từ một số ngôn ngữ lập trình hướng đối tượng như Java, C ++ hoặc Python. Bài đăng này hướng đến những người bạn không có định kiến ​​về những gì bạn nghĩ
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3is hoặc nó nên là gì. Tôi sẽ cố gắng giải thích
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 là gì và tại sao nó hữu ích một cách đơn giản mà không có biệt ngữ không cần thiết.what
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 is and why it is helpful in a simple manner without unnecessary jargon.

Có lẽ bạn đã trì hoãn lặn vào

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 vì nó trông kỳ lạ và đáng sợ. Hoặc có thể bạn chỉ sử dụng nó bởi vì StackoverFlow nói rằng bạn cần nó để thực hiện một số điều nhất định trong React.

Trước khi chúng tôi đi sâu vào những gì

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 thực sự là và tại sao bạn sẽ sử dụng nó, trước tiên chúng tôi cần hiểu sự khác biệt giữa lập trình chức năng và lập trình hướng đối tượng.functional programming and object-oriented programming.

Chức năng so với lập trình hướng đối tượng

Bạn có thể hoặc không biết rằng JavaScript có cả cấu trúc chức năng và hướng đối tượng, vì vậy bạn có thể chọn tập trung vào cái này hoặc cái kia hoặc sử dụng cả hai.

Tôi đã tham gia chương trình chức năng sớm trong hành trình JavaScript của mình và tránh lập trình hướng đối tượng như bệnh dịch hạch. Tôi đã không biết hoặc hiểu các từ khóa hướng đối tượng như

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3. Tôi nghĩ rằng một lý do tôi đã không hiểu điều đó là vì tôi đã thực sự hiểu tại sao nó lại cần thiết. Có vẻ như tôi có thể làm mọi thứ tôi cần làm mà không cần dựa vào
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3.

Và tôi đã đúng.

Loại của. Bạn có thể có thể nhận được bằng cách chỉ tập trung vào một mô hình và không bao giờ tìm hiểu về cái kia, nhưng bạn sẽ bị giới hạn với tư cách là một nhà phát triển JavaScript. Để minh họa sự khác biệt giữa lập trình chức năng và hướng đối tượng, tôi sẽ sử dụng một mảng dữ liệu bạn bè trên Facebook làm ví dụ.

Hãy để nói rằng bạn đang xây dựng một ứng dụng web nơi người dùng đăng nhập với Facebook và bạn hiển thị một số dữ liệu liên quan đến bạn bè trên Facebook của họ. Bạn sẽ cần phải nhấn điểm cuối trên Facebook để lấy dữ liệu của bạn bè của họ. Nó có thể có một số thông tin như

function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    }
  };
}
const objectFriends = data.map(initializeFriend)
objectFriends[0].getThreeRandomPosts() 
// Gets three of Bob Ross's posts
1, ________ 22, ________ 23,
function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    }
  };
}
const objectFriends = data.map(initializeFriend)
objectFriends[0].getThreeRandomPosts() 
// Gets three of Bob Ross's posts
4,
function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    }
  };
}
const objectFriends = data.map(initializeFriend)
objectFriends[0].getThreeRandomPosts() 
// Gets three of Bob Ross's posts
5,
function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    }
  };
}
const objectFriends = data.map(initializeFriend)
objectFriends[0].getThreeRandomPosts() 
// Gets three of Bob Ross's posts
6 và
function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    }
  };
}
const objectFriends = data.map(initializeFriend)
objectFriends[0].getThreeRandomPosts() 
// Gets three of Bob Ross's posts
7.

const data = [
  {
    firstName: 'Bob',
    lastName: 'Ross',
    username: 'bob.ross',    
    numFriends: 125,
    birthday: '2/23/1985',
    lastTenPosts: ['What a nice day', 'I love Kanye West', ...],
  },
  ...
]

Dữ liệu trên là những gì bạn nhận được từ API Facebook (giả, tưởng tượng). Bây giờ bạn cần phải chuyển đổi nó, để nó ở định dạng hữu ích cho bạn và dự án của bạn. Hãy nói rằng bạn muốn hiển thị những điều sau đây cho mỗi người bạn của người dùng:

  • Tên của họ ở định dạng
    function initializeFriend(data) {
      return {
        fullName: `${data.firstName} ${data.lastName}`,
        getThreeRandomPosts: function() {
          // get three random posts from data.lastTenPosts
        },
        getDaysUntilBirthday: function() {
          // use data.birthday to get the num days until birthday
        }
      };
    }
    const objectFriends = data.map(initializeFriend)
    objectFriends[0].getThreeRandomPosts() 
    // Gets three of Bob Ross's posts
    8
  • Ba bài viết ngẫu nhiên
  • Số ngày cho đến sinh nhật của họ

Phương pháp tiếp cận chức năng

Một cách tiếp cận chức năng sẽ chuyển toàn bộ mảng hoặc mỗi phần tử của một mảng thành một hàm trả về dữ liệu được thao tác mà bạn cần:

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]

Bạn bắt đầu với dữ liệu thô (từ API Facebook). Để biến nó thành dữ liệu hữu ích cho bạn, bạn chuyển dữ liệu vào một hàm và đầu ra là hoặc bao gồm dữ liệu được thao tác mà bạn có thể sử dụng trong ứng dụng của mình để hiển thị cho người dùng.

Bạn có thể tưởng tượng làm một cái gì đó tương tự để có được ba bài viết ngẫu nhiên và tính toán số ngày cho đến sinh nhật người bạn đó.

Cách tiếp cận chức năng là lấy dữ liệu thô của bạn, truyền nó qua một hàm hoặc nhiều chức năng và xuất dữ liệu hữu ích cho bạn và dự án của bạn.

Cách tiếp cận hướng đối tượng

Cách tiếp cận hướng đối tượng có thể khó nắm bắt hơn một chút đối với những người mới lập trình và học JavaScript. Ý tưởng ở đây là bạn biến mỗi người bạn thành một đối tượng có mọi thứ cần thiết để tạo ra những gì bạn là nhà phát triển cần.into an object that has everything it needs to generate what you as the developer need.

Bạn có thể tạo các đối tượng có thuộc tính

function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    }
  };
}
const objectFriends = data.map(initializeFriend)
objectFriends[0].getThreeRandomPosts() 
// Gets three of Bob Ross's posts
9 và hai hàm
function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    },
    greeting: function() {
      return `Hello, this is ${fullName}'s data!`
    }
  };
}
0 và
function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    },
    greeting: function() {
      return `Hello, this is ${fullName}'s data!`
    }
  };
}
1 dành riêng cho người bạn đó.

function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    }
  };
}
const objectFriends = data.map(initializeFriend)
objectFriends[0].getThreeRandomPosts() 
// Gets three of Bob Ross's posts

Cách tiếp cận hướng đối tượng là tạo các đối tượng cho dữ liệu của bạn có trạng thái và bao gồm tất cả thông tin họ cần để tạo dữ liệu hữu ích cho bạn và dự án của bạn.

Điều này có liên quan gì đến điều này?

Bạn có thể chưa bao giờ nghĩ sẽ viết một cái gì đó như

function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    },
    greeting: function() {
      return `Hello, this is ${fullName}'s data!`
    }
  };
}
2 ở trên và bạn có thể nghĩ rằng một cái gì đó giống như thế có thể khá hữu ích. Tuy nhiên, bạn cũng có thể nhận thấy rằng nó không thực sự hướng đến đối tượng.truly object-oriented.

Lý do duy nhất mà các phương pháp

function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    },
    greeting: function() {
      return `Hello, this is ${fullName}'s data!`
    }
  };
}
0 hoặc
function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    },
    greeting: function() {
      return `Hello, this is ${fullName}'s data!`
    }
  };
}
1 thậm chí sẽ hoạt động trong ví dụ trên là vì đóng cửa. Họ vẫn có quyền truy cập vào
function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    },
    greeting: function() {
      return `Hello, this is ${fullName}'s data!`
    }
  };
}
5 sau khi
function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    },
    greeting: function() {
      return `Hello, this is ${fullName}'s data!`
    }
  };
}
2 trả lại vì đóng cửa. Để biết thêm thông tin về việc đóng cửa, hãy xem bạn không biết JS: Phạm vi & Đóng.

Điều gì sẽ xảy ra nếu bạn có một phương pháp khác, hãy để Lôi gọi nó là

function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    },
    greeting: function() {
      return `Hello, this is ${fullName}'s data!`
    }
  };
}
7. Lưu ý rằng một phương thức (liên quan đến một đối tượng trong JavaScript) chỉ là một thuộc tính có giá trị là một hàm. Chúng tôi muốn
function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    },
    greeting: function() {
      return `Hello, this is ${fullName}'s data!`
    }
  };
}
7 làm điều gì đó như thế này:

function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    },
    greeting: function() {
      return `Hello, this is ${fullName}'s data!`
    }
  };
}

Công việc vừa ý?

No!

Tất cả mọi thứ trong đối tượng mới được tạo của chúng tôi đều có quyền truy cập vào tất cả các biến trong

function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    },
    greeting: function() {
      return `Hello, this is ${fullName}'s data!`
    }
  };
}
2 nhưng không phải bất kỳ thuộc tính hoặc phương thức nào trong chính đối tượng. Chắc chắn, bạn sẽ đặt câu hỏi:

Bạn có thể sử dụng
function initializeFriend(data) {
  return {
    lastTenPosts: data.lastTenPosts,
    birthday: data.birthday,    
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from this.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use this.birthday to get the num days until birthday
    },
    greeting: function() {
      const numDays = this.getDaysUntilBirthday()      
      return `Hello, this is ${this.fullName}'s data! It is ${numDays} until ${this.fullName}'s birthday!`
    }
  };
}
0 và
function initializeFriend(data) {
  return {
    lastTenPosts: data.lastTenPosts,
    birthday: data.birthday,    
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from this.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use this.birthday to get the num days until birthday
    },
    greeting: function() {
      const numDays = this.getDaysUntilBirthday()      
      return `Hello, this is ${this.fullName}'s data! It is ${numDays} until ${this.fullName}'s birthday!`
    }
  };
}
1 để trả lại lời chào không?

Vâng, bạn hoàn toàn có thể. Nhưng điều gì sẽ xảy ra nếu chúng ta cũng muốn đưa vào lời chào bao nhiêu ngày cho đến sinh nhật người bạn đó? Chúng tôi sẽ phải tìm cách gọi

function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    },
    greeting: function() {
      return `Hello, this is ${fullName}'s data!`
    }
  };
}
1 từ trong vòng
function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    },
    greeting: function() {
      return `Hello, this is ${fullName}'s data!`
    }
  };
}
7.

Nó thời gian cho

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3!

Ảnh của Sydney Rae trên unplash

Cuối cùng, cái này là gì

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 có thể đề cập đến những điều khác nhau trong các trường hợp khác nhau. Theo mặc định,
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 đề cập đến đối tượng toàn cầu (trong trình duyệt, đây là đối tượng
function initializeFriend(data) {
  return {
    lastTenPosts: data.lastTenPosts,
    birthday: data.birthday,    
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from this.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use this.birthday to get the num days until birthday
    },
    greeting: function() {
      const numDays = this.getDaysUntilBirthday()      
      return `Hello, this is ${this.fullName}'s data! It is ${numDays} until ${this.fullName}'s birthday!`
    }
  };
}
7), đó là tất cả những gì hữu ích. Quy tắc
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 hữu ích cho chúng tôi ngay bây giờ là như sau:

Nếu

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 được sử dụng trong một phương thức đối tượng và phương thức được gọi trong bối cảnh của đối tượng đó,
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 đề cập đến chính đối tượng.

Bạn nói được gọi là trong bối cảnh của đối tượng đó, điều đó thậm chí có nghĩa là gì?

Đừng lo lắng, chúng tôi sẽ nhận được điều đó sau!

Vì vậy, nếu chúng tôi muốn gọi

function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    },
    greeting: function() {
      return `Hello, this is ${fullName}'s data!`
    }
  };
}
1 từ trong vòng ____37, chúng tôi chỉ có thể gọi
function initializeFriend(data) {
  return {
    lastTenPosts: data.lastTenPosts,
    birthday: data.birthday,
    username: data.username,    
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from this.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use this.birthday to get the num days until birthday
    },
    greeting: function() {
      const numDays = this.getDaysUntilBirthday()      
      return `Hello, this is ${this.fullName}'s data! It is ${numDays} until ${this.fullName}'s birthday!`
    },
    onFriendClick: function() {
      window.open(`https://facebook.com/${this.username}`)
    }
  };
}
3 vì
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 trong kịch bản đó chỉ đề cập đến chính đối tượng.

Lưu ý bên lề: Don Tiết sử dụng

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 trong hàm OLE thông thường trong phạm vi toàn cầu hoặc trong phạm vi của một hàm khác!
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 là một cấu trúc hướng đối tượng. Do đó, nó chỉ có ý nghĩa trong bối cảnh của một đối tượng (hoặc lớp)!

Hãy để Let Refactor

function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    },
    greeting: function() {
      return `Hello, this is ${fullName}'s data!`
    }
  };
}
2 để sử dụng
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3:

function initializeFriend(data) {
  return {
    lastTenPosts: data.lastTenPosts,
    birthday: data.birthday,    
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from this.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use this.birthday to get the num days until birthday
    },
    greeting: function() {
      const numDays = this.getDaysUntilBirthday()      
      return `Hello, this is ${this.fullName}'s data! It is ${numDays} until ${this.fullName}'s birthday!`
    }
  };
}

Bây giờ, tất cả mọi thứ mà đối tượng này cần đều được đưa vào chính đối tượng một khi

function initializeFriend(data) {
  return {
    lastTenPosts: data.lastTenPosts,
    birthday: data.birthday,
    username: data.username,    
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from this.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use this.birthday to get the num days until birthday
    },
    greeting: function() {
      const numDays = this.getDaysUntilBirthday()      
      return `Hello, this is ${this.fullName}'s data! It is ${numDays} until ${this.fullName}'s birthday!`
    },
    onFriendClick: function() {
      window.open(`https://facebook.com/${this.username}`)
    }
  };
}
9 được thực thi. Phương pháp của chúng tôi không còn dựa vào việc đóng cửa. Họ chỉ sử dụng thông tin có trong chính đối tượng.

OK, vì vậy đó là một cách để sử dụng
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3, nhưng bạn nói rằng
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 có thể là nhiều thứ khác nhau tùy thuộc vào bối cảnh. Điều đó nghĩa là gì? Tại sao nó luôn luôn đề cập đến chính đối tượng?

Có một số lần bạn muốn buộc

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 là một cái gì đó đặc biệt. Một ví dụ tốt là cho người xử lý sự kiện. Hãy nói rằng chúng tôi muốn mở một trang Facebook của bạn bè khi người dùng nhấp vào họ. Chúng tôi có thể thêm một phương thức
 
3 vào đối tượng của chúng tôi:

function initializeFriend(data) {
  return {
    lastTenPosts: data.lastTenPosts,
    birthday: data.birthday,
    username: data.username,    
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from this.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use this.birthday to get the num days until birthday
    },
    greeting: function() {
      const numDays = this.getDaysUntilBirthday()      
      return `Hello, this is ${this.fullName}'s data! It is ${numDays} until ${this.fullName}'s birthday!`
    },
    onFriendClick: function() {
      window.open(`https://facebook.com/${this.username}`)
    }
  };
}

Lưu ý rằng chúng tôi đã thêm

function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    }
  };
}
const objectFriends = data.map(initializeFriend)
objectFriends[0].getThreeRandomPosts() 
// Gets three of Bob Ross's posts
3 vào đối tượng của mình, để
 
5 có quyền truy cập vào nó, để chúng tôi có thể mở một cửa sổ mới với trang Facebook của người bạn đó. Bây giờ chúng ta chỉ cần viết HTML:

 

Và bây giờ JavaScript:

const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)

Trong mã trên, chúng tôi tạo một đối tượng cho Bob Ross. Chúng tôi nhận được phần tử DOM được liên kết với Bob Ross. Và bây giờ chúng tôi muốn thực hiện phương thức

 
5 để mở trang Facebook của Bob. Nên làm việc như mong đợi, phải không?

Nope!

Có chuyện gì?

Lưu ý rằng chức năng chúng tôi đã chọn cho trình xử lý onclick là

 
7. Xem vấn đề chưa? Điều gì sẽ xảy ra nếu chúng ta viết lại nó như thế này:

bobRossDOMEl.addEventListener("onclick", function() {  window.open(`https://facebook.com/${this.username}`)})bobRossDOMEl.addEventListener("onclick", function() {
  window.open(`https://facebook.com/${this.username}`)
})

Bây giờ bạn có thấy vấn đề không? Khi chúng tôi đặt trình xử lý onclick là

 
7 Những gì chúng tôi thực sự đang làm là lấy chức năng được lưu trữ trong
 
7 và chuyển nó thành một đối số. Nó không còn được đính kèm trên mạng với
const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
0, điều đó có nghĩa là
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 không còn đề cập đến
const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
0. Nó thực sự đề cập đến đối tượng toàn cầu, có nghĩa là
const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
3 không được xác định. Có vẻ như chúng ta không gặp may tại thời điểm này.

Nó thời gian cho

const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
4!

Ảnh của Ksenia Makagonova trên unplash

Ràng buộc rõ ràng này

Những gì chúng ta cần làm là liên kết rõ ràng

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 với
const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
0. Chúng ta có thể làm điều đó bằng cách sử dụng
const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
4:

const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossObj.onFriendClick = bobRossObj.onFriendClick.bind(bobRossObj)
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)

Trước đó,

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 đã được đặt dựa trên quy tắc mặc định. Với việc sử dụng
const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
4, chúng tôi đã đặt rõ ràng giá trị của
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 trong
 
7 để trở thành chính đối tượng hoặc
const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
0.

Cho đến thời điểm này, chúng tôi đã thấy lý do tại sao

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 là hữu ích và tại sao bạn có thể muốn ràng buộc rõ ràng
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3. Chủ đề cuối cùng chúng tôi sẽ đề cập đến
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 là các hàm mũi tên.

Hàm mũi tên

Bạn có thể nhận thấy rằng các chức năng mũi tên là điều mới. Mọi người dường như thích họ vì họ súc tích và thanh lịch. Bạn có thể biết rằng chúng hơi khác so với các chức năng bình thường nhưng có lẽ bạn không biết sự khác biệt là gì.

Có lẽ cách đơn giản nhất để mô tả cách các chức năng mũi tên khác nhau là:

Bất cứ điều gì

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 đề cập đến nơi một hàm mũi tên được khai báo,
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 đề cập đến cùng một điều bên trong hàm mũi tên đó.

OK, điều đó không hữu ích, tôi nghĩ đó là hành vi của một chức năng bình thường?

Hãy để giải thích với ví dụ

function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    },
    greeting: function() {
      return `Hello, this is ${fullName}'s data!`
    }
  };
}
2 của chúng tôi. Hãy nói rằng chúng tôi muốn thêm một chức năng trợ giúp nhỏ trong
function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    },
    greeting: function() {
      return `Hello, this is ${fullName}'s data!`
    }
  };
}
7:

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
0

Điều này sẽ hoạt động? Nếu không, làm thế nào chúng ta có thể thay đổi nó để làm cho nó hoạt động?

Không, nó sẽ không hoạt động. Bởi vì

const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossObj.onFriendClick = bobRossObj.onFriendClick.bind(bobRossObj)
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
0 không được gọi trong bối cảnh của một đối tượng,
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 bên trong
const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossObj.onFriendClick = bobRossObj.onFriendClick.bind(bobRossObj)
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
0 rơi trở lại quy tắc mặc định là đối tượng toàn cầu.

Bạn nói rằng nó không được gọi là trong bối cảnh của một đối tượng. Nếu đó không phải là người được gọi là trong bối cảnh của một đối tượng thì tôi không biết là gì.

Tôi biết rằng, trong bối cảnh của một đối tượng, là thuật ngữ mơ hồ. Có lẽ một cách tốt để xác định xem một hàm được gọi là trong bối cảnh của một đối tượng hay không là tự nói với mình thông qua cách gọi chức năng và xác định xem một đối tượng có gắn liền với chức năng hay không.

Hãy để nói chuyện thông qua những gì xảy ra khi chúng ta thực hiện

const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossObj.onFriendClick = bobRossObj.onFriendClick.bind(bobRossObj)
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
4. Hãy lấy cho tôi đối tượng
const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
0, hãy tìm thuộc tính
 
5 và gọi hàm được gán cho thuộc tính đó.call the function assigned to that attribute.”

Bây giờ, hãy để nói chuyện thông qua những gì xảy ra khi chúng ta thực hiện

const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossObj.onFriendClick = bobRossObj.onFriendClick.bind(bobRossObj)
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
7. Hãy lấy cho tôi chức năng với tên
const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossObj.onFriendClick = bobRossObj.onFriendClick.bind(bobRossObj)
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
0 và gọi nó là. Lưu ý làm thế nào không có đề cập đến một đối tượng?

OK, ở đây, một điều khó khăn để kiểm tra kiến ​​thức của bạn. Hãy nói rằng có một chức năng

const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossObj.onFriendClick = bobRossObj.onFriendClick.bind(bobRossObj)
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
9 trong đó tất cả những gì nó làm là các chức năng gọi:

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
1

Điều gì sẽ xảy ra nếu chúng ta đã làm điều này:

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
00? Bạn có nói rằng
 
5 được gọi là trong bối cảnh của một đối tượng không?
const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
3 sẽ được xác định?

Hãy nói chuyện với nhau thông qua nó: Hãy lấy đối tượng

const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
0 và tìm kiếm thuộc tính
 
5. Lấy giá trị của nó (tình cờ là một hàm), chuyển nó vào
const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossObj.onFriendClick = bobRossObj.onFriendClick.bind(bobRossObj)
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
9 và đặt tên cho nó
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
06. Bây giờ, thực thi chức năng có tên
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
06. Lưu ý rằng chức năng được tách ra khỏi
const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
0 trước khi nó được gọi và do đó không được gọi là trong bối cảnh của đối tượng
const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
0, điều đó có nghĩa là
const bobRossObj = initializeFriend(data[0])
const bobRossDOMEl = document.getElementById('Bob_Ross')
bobRossDOMEl.addEventListener("onclick", bobRossObj.onFriendClick)
3 sẽ không được xác định.

Các chức năng của mũi tên để giải cứu:

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
2

Quy tắc của chúng tôi từ trên:

Bất cứ điều gì

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 đề cập đến nơi một hàm mũi tên được khai báo,
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 đề cập đến cùng một điều bên trong hàm mũi tên đó.

Hàm mũi tên được khai báo bên trong

function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    },
    greeting: function() {
      return `Hello, this is ${fullName}'s data!`
    }
  };
}
7. Chúng tôi biết rằng khi chúng tôi sử dụng
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 trong
function initializeFriend(data) {
  return {
    fullName: `${data.firstName} ${data.lastName}`,
    getThreeRandomPosts: function() {
      // get three random posts from data.lastTenPosts
    },
    getDaysUntilBirthday: function() {
      // use data.birthday to get the num days until birthday
    },
    greeting: function() {
      return `Hello, this is ${fullName}'s data!`
    }
  };
}
7, nó đang đề cập đến chính đối tượng. Do đó,
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 bên trong hàm mũi tên đang đề cập đến chính đối tượng đó là những gì chúng ta muốn.

Sự kết luận

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 là một công cụ đôi khi được sử dụng nhưng hữu ích để phát triển các ứng dụng JavaScript. Đây chắc chắn không phải là tất cả có để
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3. Một số chủ đề không được đề cập là:

  • const fullNames = getFullNames(data)
    // ['Ross, Bob', 'Smith, Joanna', ...]
    19 và
    const fullNames = getFullNames(data)
    // ['Ross, Bob', 'Smith, Joanna', ...]
    20
  • const fullNames = getFullNames(data)
    // ['Ross, Bob', 'Smith, Joanna', ...]
    3 thay đổi như thế nào khi
    const fullNames = getFullNames(data)
    // ['Ross, Bob', 'Smith, Joanna', ...]
    22 tham gia
  • Cách
    const fullNames = getFullNames(data)
    // ['Ross, Bob', 'Smith, Joanna', ...]
    3 thay đổi với ES6
    const fullNames = getFullNames(data)
    // ['Ross, Bob', 'Smith, Joanna', ...]
    24

Tôi khuyến khích bạn tự hỏi mình những câu hỏi về những gì bạn nghĩ

const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3 nên ở trong một số tình huống nhất định, và sau đó kiểm tra bản thân bằng cách chạy mã đó trong trình duyệt. Nếu bạn muốn tìm hiểu thêm về
const fullNames = getFullNames(data)
// ['Ross, Bob', 'Smith, Joanna', ...]
3, hãy xem bạn không biết JS: Nguyên mẫu này & đối tượng.

Và nếu bạn muốn tự kiểm tra, hãy xem các bài tập YDKJS: Các nguyên mẫu này & đối tượng.

Photo by Jonas Jacobsson on Unsplash


Học mã miễn phí. Chương trình giảng dạy nguồn mở của Freecodecamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu