2012-12-12 23 views
5

Trong bản nháp Ecmascript 6 hiện tại (tháng 11 năm 2012), có hỗ trợ chính thức cho thuộc tính __proto__ (Mục B.3.1). Điều này đến như một chút ngạc nhiên khi, trong việc triển khai trình duyệt hiện tại, thuộc tính __proto__ không được chấp nhận.Ecmascript 6 có hỗ trợ tài sản __proto__ có thể thay đổi không?

Nếu dự thảo hiện tại là viết tắt, ES6 có hỗ trợ đầy đủ cho các nguyên mẫu có thể thay đổi không? Tôi có thể cung cấp một mẫu thử nghiệm mới cho một đối tượng hiện có theo cách mà tôi hiện có thể có trong Firefox không?

+0

Lệnh 'tài sản __proto__' là "phản đối", bởi vì không phải là một bất động sản tiêu chuẩn của nó, thay vì 'Object.getPrototypeOf (someObject);' là được ưa thích (ECMA5 std, do đó X hỗ trợ -browser). Ngoài ra, việc thay đổi nguyên mẫu một cách nhanh chóng không phải là mới: tôi đã thử nó trong chrome và IE, thay đổi nguyên mẫu của một đối tượng tùy chỉnh thành 'mảng mới', mà không có bất kỳ vấn đề gì ... model –

+0

@Elias. Object.getPrototypeOf() là một tính năng Ecmascript 5 như _ _ proto _ _ không bao giờ là một phần của tiêu chuẩn Ecmascript. Có vẻ như _ _ proto _ _ lần đầu tiên không được chấp nhận từ các Trình duyệt và sau đó được giới thiệu (lần đầu tiên) trong tiêu chuẩn. Mặc dù thứ tự các sự kiện này xuất hiện bất thường, điều này có vẻ như vậy. Tôi hỏi cụ thể về "mới" _ _ proto _ _ trong Ecmascript 6 - B.3.1. - –

+0

Tôi không chắc bạn đang hỏi gì. Đó là trong bản thảo hiện tại, vì vậy có, có vẻ như chúng tôi sẽ có điều đó. Mặt khác, nó vẫn là một bản nháp, vì vậy mọi thứ đều có thể thay đổi. – bfavaretto

Trả lời

8

Hiện tại, nó được lên kế hoạch cho biến dạng __proto__ có trong thông số kỹ thuật (và không chỉ trong phụ lục b). Kế hoạch hiện tại là cho nó là một thuộc tính dữ liệu ma thuật chỉ tồn tại trên Object.prototype và hoạt động như một accessor (phần ma thuật). Thuộc tính này cũng sẽ bị xóa, xóa khả năng biến đổi __proto__ cho lĩnh vực đó khi bị xóa. Tôi đã triển khai __proto__ theo mô tả này trong máy ảo ES6 của tôi http://benvie.github.com/continuum.

Ban đầu nó không được chấp nhận và thay thế, nhưng không có sự đồng thuận nào được hình thành trên sự thay thế đó. Khả năng kế thừa từ nội trang là mục tiêu cuối cùng và quyết định là __proto__ đã được phổ biến rộng rãi (mọi thứ nhưng có nó) và hoàn thành mục tiêu này, vì vậy đường đi của kháng cự ít nhất là nắm lấy và mã hóa nó.

+1

chỉ nhận được trên đó và, whoaw, nó điên rồ! – Ven

+1

Câu trả lời này có vẻ đã lỗi thời. Có vẻ như sự đồng thuận cho sự thay thế ('Reflect.setPrototypeOf') đã được hình thành, và' __proto__' vẫn còn trong di sản web Phụ lục B; mà không có kế hoạch để di chuyển nó. – Bergi

+0

Theo http://webreflection.blogspot.com/2013/05/objectsetprototypeofo-proto-is-in-es6.html, cách chính thức để thực hiện điều này trong ES6 sẽ là 'Object.setPrototypeOf' –

1

Theo tài liệu ECMAScript 6 phát hành, __proto__ vẫn còn tồn tại nhưng như BergiMattBrowne chỉ trong các giải pháp trên, chúng ta có thể sử dụng Object.setPrototypeOf đó là phiên bản modifed của __proto__.

Khi chức năng setPrototypeOf được gọi với đối số O và proto, các bước sau đây được thực hiện:

  • Hãy O be RequireObjectCoercible (O).
  • ReturnIfAbrupt (O).
  • Nếu loại (proto) không phải là Object hoặc Null, hãy ném ngoại lệ TypeError.
  • Nếu loại (O) không phải là đối tượng, hãy trả lại O.
  • Cho trạng thái là O. [SetPrototypeOf].
  • ReturnIfAbrupt (trạng thái).
  • Nếu trạng thái sai, hãy ném ngoại lệ TypeError.
  • Return O.
Các vấn đề liên quan