Hàm tạo javascript không hoạt động

Khi bạn “gọi” hàm tạo bằng từ khóa

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
3, bạn sẽ nhận được một đối tượng mới được cấp phát và hàm tạo được gọi với đối tượng mới là ngữ cảnh hiện tại. Nếu bạn không trả về một cách rõ ràng bất cứ thứ gì từ hàm tạo, thì kết quả là bạn sẽ nhận được đối tượng mới

Như vậy, phần thân của hàm khởi tạo được dùng để khởi tạo đối tượng mới được tạo. Có một điều khác. Đối tượng mới được tạo được khởi tạo để có nguyên mẫu. Nguyên mẫu nào? . Vì vậy, chúng ta có thể viết

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'

Nhờ cơ chế bên trong của toán tử

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
5 của JavaScript, chúng ta có thể sử dụng nó để kiểm tra xem một đối tượng có khả năng đã được tạo bằng một hàm tạo cụ thể hay không

snafu instanceof Fubar
  //=> true

[Bạn có thể “đánh lừa”

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
5 khi làm việc với các thành ngữ nâng cao hơn, hoặc nếu bạn là kiểu người ba hoa ác ý chuyên thu thập các trường hợp góc cạnh ngôn ngữ và thích áp đặt chúng vào các ứng viên trong các cuộc phỏng vấn xin việc. Nhưng nó hoạt động đủ tốt cho mục đích của chúng tôi. ]

vấn đề

Điều gì xảy ra nếu chúng ta gọi hàm tạo nhưng vô tình bỏ qua từ khóa

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
3?

var fubar = Fubar["Fsked Up", "Beyond All Recognition"];

fubar
  //=> undefined

William-Thomas-Friedrich. ? . vì vậy

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
8 là không xác định. Đó không phải là những gì chúng tôi muốn. Trên thực tế, nó còn tệ hơn thế

JavaScript đặt

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
9 thành môi trường toàn cầu theo mặc định để gọi một hàm thông thường, vì vậy chúng ta vừa hiểu nhầm về môi trường toàn cầu. Chúng ta có thể khắc phục phần nào

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
0

Mặc dù mã

snafu instanceof Fubar
  //=> true
0 có thể bị bỏ qua trong các bài đăng trên blog và sách [mea culpa. ], trong sản xuất, nó gần như là bắt buộc vì những lý do như thế này. Tuy nhiên, các nhà xây dựng không tính đến khả năng được gọi mà không có từ khóa
Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
3 là một vấn đề tiềm ẩn

Vậy chúng ta có thể làm gì?

giải pháp. tự động khởi tạo

Trong JavaScript hiệu quả, David Herman mô tả tự động khởi tạo. Khi chúng ta gọi một hàm tạo với

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
3, Biến giả
Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
9 được đặt thành một thể hiện mới của “lớp” của chúng ta, có thể nói là như vậy. Chúng tôi có thể sử dụng điều này để phát hiện xem hàm tạo của chúng tôi có được gọi với
Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
3 hay không

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
6

Tại sao phải làm cho nó hoạt động mà không có

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
3? . Xem xét

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
9

snafu instanceof Fubar
  //=> true
7 trang trí một hàm bằng cách trả về một phiên bản của hàm ghi lại các đối số của nó. Hãy thử nó trên bản gốc
snafu instanceof Fubar
  //=> true
8

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
2

Điều này không hiệu quả vì

snafu instanceof Fubar
  //=> true
9 thực sự là một thể hiện của
var fubar = Fubar["Fsked Up", "Beyond All Recognition"];

fubar
  //=> undefined
0, không phải của
snafu instanceof Fubar
  //=> true
8. Nhưng nếu chúng ta sử dụng phiên bản khởi tạo tự động của
snafu instanceof Fubar
  //=> true
8

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
7

Bây giờ nó hoạt động, nhưng tất nhiên

snafu instanceof Fubar
  //=> true
9 là một thể hiện của
snafu instanceof Fubar
  //=> true
8, không phải của
var fubar = Fubar["Fsked Up", "Beyond All Recognition"];

fubar
  //=> undefined
0. Đó là điều bạn muốn? . ? . Nó không "chỉ hoạt động", nhưng nó có thể làm cho một số thứ trở nên khả thi [như trang trí các nhà xây dựng] mà nếu không thì thậm chí còn khó thực hiện hơn

giải pháp. quá tải ý nghĩa của nó

Có thể rất thuận tiện khi có một hàm kiểm tra xem một đối tượng có phải là một thể hiện của một lớp cụ thể không. Nếu chúng ta có thể chấp nhận ý tưởng về một chức năng thực hiện hai việc khác nhau, chúng ta có thể biến phương thức khởi tạo thành bài kiểm tra

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
5 của riêng mình

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
2

Điều này cho phép chúng tôi sử dụng hàm tạo làm đối số trong vị ngữ và nhiều công văn hoặc dưới dạng bộ lọc

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
0

giải pháp. giết nó bằng lửa

Nếu chúng tôi không có nhu cầu cấp thiết nào về tự động khởi tạo và nếu chúng tôi không quan tâm đến các chức năng bị quá tải, chúng tôi có thể tránh vô tình gọi một hàm tạo mà không sử dụng

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
3. Chúng tôi thấy rằng
snafu instanceof Fubar
  //=> true
0 có thể hữu ích, nhưng nó không phải là thuốc chữa bách bệnh. Nó sẽ không gây ra lỗi nếu chúng ta không thực sự cố gắng gán một giá trị cho môi trường toàn cầu. Và nếu chúng ta cố gắng làm điều gì đó trước khi gán giá trị, nó sẽ làm điều đó bất kể là gì

Có lẽ tốt hơn là tự mình giải quyết vấn đề. Olivier Scherrer gợi ý mẫu sau

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
1

Đơn giản và an toàn hơn là chỉ dựa vào

snafu instanceof Fubar
  //=> true
0. Nếu bạn muốn có một bài kiểm tra
Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
5 đơn giản, bạn có thể đưa nó vào hàm tạo dưới dạng một phương thức hàm

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
2

Ở đó bạn có nó. Các hàm tạo không thành công khi được gọi mà không có

Fubar.prototype.concatenated = function [] {
  return this._foo + " " + this._bar;
}

snafu.concatenated[]
  //=> 'Situation Normal All Fsked Up'
3 là một vấn đề tiềm ẩn và ba giải pháp chúng ta có thể sử dụng tương ứng là tự động khởi tạo, làm quá tải hàm tạo hoặc tắt các lệnh gọi đó bằng lửa

Chủ Đề