2012-11-27 47 views
5

Chúng tôi đang sử dụng một tùy chỉnh thư viện JavaScript tại nơi làm việc, nơi chúng tôi làm việc này:workaround __proto__ cho Internet Explorer IE 10

DOM.__proto__ = Library.prototype; 

để nhanh chóng chuyển chức năng nội bộ/tài sản đối tượng DOM để nó có thể được sử dụng tương tự như cách Ví dụ jQuery làm điều đó.

Đối với một dự án mới, chúng tôi cần triển khai nó cho Internet Explorer nhưng tiếc là __proto__ không được hỗ trợ bởi IE.

Bất kỳ ý tưởng, giải pháp nào của các polyfills cho việc này? Yêu cầu chỉ là IE10 (nhưng IE9 cũng sẽ tốt hơn).

+0

Rất khó có giải pháp tốt. Bạn chỉ có thể * mở rộng * nguyên mẫu trong IE thay vì thay thế/cướp/tiêm/bất kể nguyên mẫu của đối tượng khác. – xiaoyi

+0

Ok, nhưng làm thế nào sẽ mở rộng nó trông giống như trong IE? – user1768759

Trả lời

1

Thay vì trực tiếp mở rộng phần tử DOM như bạn đang có, bạn có thể gói nó với API của mình;

// Wrapping Constructor 
function Library(element) { 
    this.element = element; 
} 

// Whatever it is your library does 
Library.prototype = { 
    // some example method 
    html: function(markup) { 
    // refer to "this.element" instead of "this" 
    this.element.innerHTML = markup; 
    } 
}; 

// example 
var wrappedElement = new Library(document.getElementById('unique')); 

// refer to the API rather than the Element directly 
wrappedElement.html('<span>Hello World</span>'); 

Bạn cũng có thể mở rộng Thư viện thêm một số bằng cách safely subclassing Array with this technique.

Hy vọng điều này sẽ hữu ích, cảm ơn.

0

gì về mở rộng nó:

$.extend(Element.constructor.prototype, Library.prototype); 

EDIT: do công phản đối kịch liệt, tôi sẽ lưu ý rằng extend là một khái niệm rất quen thuộc trong bối cảnh của chương trình JS trong năm 2014. Bạn có thể tìm thấy nhiều ví dụ trực tuyến về nó là gì và nó hoạt động như thế nào, và có một cơ hội khá tốt, ít nhất một thư viện mà bạn đã sử dụng trong dự án của bạn thực hiện nó (jQuery, Lo-Dash/Underscore, AngularJS, Ember.js ...)

+0

Ngay cả khi 'jQuery' được đề cập trong câu hỏi nó vẫn là một cái chung và không liên quan đến' jQuery', vì vậy bạn vẫn nên đề cập đến '$ .extend' là một phần của thư viện jQuery. Vì điều này có thể không hiển nhiên đối với mọi người đọc. –

+1

@ t.niese Trừ khi ai đó đã sống trong một hang động trong mười năm qua, tôi nghĩ rằng họ biết rằng '$' chỉ ra jQuery. –

+1

@torazaburo vẫn còn đủ người không thể phân biệt giữa js, jQuery, ... và ở đây trên SO có đủ câu hỏi cho thấy mọi người không biết rằng họ đang sử dụng jQuery khi có '$'. Ngoài ra '$' không được dành riêng cho jQuery. Mặc dù hiện tại thư viện thị trưởng không cần thư viện trong tương lai. Vì vậy, tôi vẫn nghĩ rằng hoặc viết 'jQuery.extend()' hoặc đề cập rằng nó là từ jQuery sẽ là một điều tốt. –

2

Thay vì gán cho __proto__ sau khi tạo 0 Đối tượng, sử dụng Object.create (MSDN, được hỗ trợ từ IE9) để tạo đối tượng có mẫu thử chính xác, sau đó gán thuộc tính cho nó.

var DOM = {}; 
DOM.__proto__ = Library.prototype;
var DOM = Object.create(Library.prototype);

Nếu bạn muốn thay đổi nguyên mẫu của hiện tại (và thậm chí nước ngoài) đối tượng, chỉ cần tránh nó. Đó là một thực tế xấu anyway.

Các vấn đề liên quan