Điểm của phương pháp nguyên mẫu là gì?


10

Tôi đang đọc qua Javascript: Các bộ phận tốt và đấu tranh để tìm hiểu về các nguyên mẫu .

Sau một chút google, tôi đi đến kết luận rằng đó là thêm thuộc tính vào các đối tượng sau khi khai báo đối tượng.

Sử dụng tập lệnh này được phát sáng từ w3schools, tôi nhận thấy rằng việc xóa dòng thêm thuộc tính nguyên mẫu không có hiệu lực . Vậy vấn đề là gì?


//Prototyping

function employee(name,jobtitle,born)
{
this.name=name;
this.jobtitle=jobtitle;
this.born=born;
}

var fred=new employee("Fred Flintstone","Caveman",1970);
employee.prototype.salary=null; //  <---  try removing this line
fred.salary=20000;

document.write (fred.salary);


4
@Raynos cũng nói, nhưng cũng đề nghị thay thế, ví dụ: tài liệu MDN: developer.mozilla.org/en/JavaScript
StuperUser

Câu trả lời:


13

Đó không phải là cách nguyên mẫu hoạt động. Nguyên mẫu được sử dụng trong chuỗi nguyên mẫu.

Bất cứ khi nào bạn cố gắng để có được một tài sản trên một đối tượng, nó sẽ kiểm tra đối tượng cho tên thuộc tính đó. Nếu nó không tồn tại, nó sẽ tìm trong nguyên mẫu.

Thí dụ:

var o = {
  "foo": "bar",
  "method": function() { ... }
};

var o2 = Object.create(o);
var o3 = Object.create(o);

console.log(o2.hasOwnProperty("foo")); // false
console.log(o2.foo); // "bar"
console.log(o2.__proto__ === o); // true
o.baz = "foobar";
console.log(o2.baz); // "foobar"

Vì vậy, điểm của nguyên mẫu chỉ đơn giản là sử dụng lại mã và kế thừa.


Được rồi, vì vậy tôi nhận được điều này ngay bây giờ. Nhưng tôi đã cố gắng thêm một tài sản một cách linh hoạt và nó đang nói với tôi prototype is undefined---o.prototype.newProp = "mutts nuts";
Mild Fuzz

3
@MildFuzz olà một đối tượng. Các .prototypetài sản được sử dụng trên các chức năng, bỏ qua nó. Chỉ cần làmo.newProp = "mutts nuts"
Raynos

7

Khi bạn đã fred.salary=20000thêm thuộc tính tiền lương chỉ để fred. Khi sử dụng nguyên mẫu, tất cả nhân viên bạn sẽ tạo từ đó trở đi sẽ có thuộc tính lương.

Giả sử bạn có 100 trường hợp nhân viên và bạn muốn thêm thuộc tính lương cho tất cả họ. Bạn có thể làm thủ công, lặp lại qua từng nhân viên và thêm nó. Hoặc bạn có thể sử dụng nguyên mẫu và thiết lập nếu cho tất cả chúng.

Nguyên mẫu hữu ích khi bạn muốn chức năng cho một cái gì đó đã tồn tại. Giả sử bạn muốn thêm một phương thức tùy chỉnh vào mảng. Bạn sẽ làm một cái gì đó như:

Array.prototype.my_custom_method = function() {...}

Từ đó trở đi, tất cả các mảng bạn sẽ tạo, sẽ có sẵn phương thức đó.


3
Tôi ngạc nhiên rằng không ai đã đề cập rằng điều này được thiết kế để giảm sử dụng bộ nhớ. Nếu bạn cần triển khai một đối tượng phức tạp có nhiều mã, bạn không muốn mã được lặp lại trong mọi phiên bản của đối tượng. Rõ ràng, các thuộc tính dữ liệu có nhiều khả năng khác nhau trong mỗi trường hợp, nhưng bạn thường chỉ muốn một bản sao của mã, vì vậy bạn đặt nó trong nguyên mẫu.
Đaminh Cronin

1
IMO đây là câu trả lời tốt nhất cho đến nay.
Người đàn ông Muffin

5

Bạn có thể muốn xem bài viết này .

Một ngôn ngữ dựa trên nguyên mẫu có khái niệm về một đối tượng nguyên mẫu, một đối tượng được sử dụng làm khuôn mẫu để lấy các thuộc tính ban đầu cho một đối tượng mới. Bất kỳ đối tượng nào cũng có thể chỉ định các thuộc tính của riêng nó, khi bạn tạo nó hoặc trong thời gian chạy. Ngoài ra, bất kỳ đối tượng nào cũng có thể được liên kết làm nguyên mẫu cho một đối tượng khác, cho phép đối tượng thứ hai chia sẻ các thuộc tính của đối tượng đầu tiên.

Nếu bạn thêm một thuộc tính vào một đối tượng được sử dụng làm nguyên mẫu cho một tập hợp các đối tượng, thì các đối tượng mà nó là nguyên mẫu cũng có được thuộc tính mới.

Đó là một trong những lợi thế chính của ngôn ngữ dựa trên nguyên mẫu so với ngôn ngữ dựa trên lớp.

Ngoài ra, thật dễ dàng để có được sự kế thừa OO cổ điển với JS nếu bạn cần, nhưng thường rất khó để có được một mô hình nguyên mẫu cho một ngôn ngữ không thực hiện theo mặc định.


3
+1 cho bài viết ngôn ngữ dựa trên lớp so với nguyên mẫu
adivasile
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.