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ớiNhư 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ôngsnafu 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àoFubar.prototype.concatenated = function [] {
return this._foo + " " + this._bar;
}
snafu.concatenated[]
//=> 'Situation Normal All Fsked Up'
0Mặ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 ẩnVậ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ôngFubar.prototype.concatenated = function [] {
return this._foo + " " + this._bar;
}
snafu.concatenated[]
//=> 'Situation Normal All Fsked Up'
6Tạ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étFubar.prototype.concatenated = function [] {
return this._foo + " " + this._bar;
}
snafu.concatenated[]
//=> 'Situation Normal All Fsked Up'
9snafu 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
8Fubar.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
8Fubar.prototype.concatenated = function [] {
return this._foo + " " + this._bar;
}
snafu.concatenated[]
//=> 'Situation Normal All Fsked Up'
7Bâ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ơngiả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ìnhFubar.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'
0giả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àmFubar.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