Sự khác biệt là trong ví dụ sau, bạn đang tạo phương thức tĩnh, không được kế thừa nếu Example
là hàm dựng. Bằng cách xác định các thuộc tính trong thuộc tính prototype
của hàm dựng và tạo đối tượng với từ khóa new
, các đối tượng mới được tạo ra kế thừa nguyên mẫu của hàm tạo và do đó có quyền truy cập vào các phương thức đó.
Một ví dụ sẽ là phương pháp quy định tại được xây dựng trong nhà xây dựng cốt lõi, chẳng hạn như String
.. chuỗi mới được tạo ra có một phương pháp indexOf
vì đã có một định nghĩa trong nguyên mẫu các String
hàm constructor của
typeof String.prototype.indexOf // 'function'
var name = 'John';
alert(name.indexOf('J')) // 0
Các code bên dưới tạo hàm tạo hàm, đầu tiên chúng ta định nghĩa một phương thức tĩnh, tạo một đối tượng, tìm đối tượng không có phương thức getName, sau đó chúng ta định nghĩa một phương thức trong nguyên mẫu và thấy rằng đối tượng hiện có phương thức getName.
function Name(name) {
this.name = name;
};
Name.getName = function(){};
var john = new Name();
typeof john.getName // undefined
var john = new Name();
Name.prototype.getName = function(){ alert(this.name)};
typeof john.getName
john.constructor.prototype.getName == john.getName // true
Vì vậy, để nhắc lại, thừa kế trong ECMAScript được thực hiện chủ yếu bằng cách định nghĩa các thuộc tính/phương pháp trong nguyên mẫu của một nhà xây dựng chức năng, ví dụ sẽ là tất cả các nhà thầu cốt lõi như Ngày/Số/String mà có phương pháp quy định tại của họ các thuộc tính nguyên mẫu tương ứng, cho phép bạn sử dụng các phương thức đó khi bạn tạo một cá thể với từ khóa new
.
Hãy nhớ rằng đối tượng mới được tạo có thuộc tính constructor
trỏ đến hàm tạo đã tạo và chúng tôi có thể truy cập trực tiếp thuộc tính prototype
. Đối tượng john
mà chúng ta đã tạo không trực tiếp sở hữu phương thức getName
, vì trình thông dịch không thể tìm thấy trực tiếp trên đối tượng mà nó di chuyển lên trên hàm tạo và tìm nó trong nguyên mẫu của nó. Và btw, chúng tôi đã không thực sự phải tạo một thể hiện mới của đối tượng john
, như được chỉ ra trong câu trả lời khác, bạn có thể xác định các thuộc tính trong nguyên mẫu sau khi bạn tạo hàm khởi tạo ban đầu và tất cả các đối tượng sẽ kế thừa các nguyên mẫu đó các thuộc tính ngay cả sau khi chúng được tạo ra.
Một phương pháp tĩnh không thể dựa vào bối cảnh, không thể dựa vào một trường hợp cụ thể của một lớp, không thể dựa vào các từ khóa this
do đó điều này sẽ không phải là một phương pháp tĩnh:
function Name(name) {
this.name = name;
this.getName = function() { return this.name; }
};
sẽ này là một ví dụ về một phương pháp tĩnh:
Name.getName = function() {};
nhưng hoàn toàn không có ý nghĩa trong việc đưa ra getName
tĩnh vì như tên của nó nó phải dựa trên một trường hợp đối tượng để xác định những thuộc tính tên là, bạn nên có gener hơn Các hàm trợ giúp ic như các hàm phân tích cú pháp như Date.parse
như các phương thức tĩnh và xác định các phương thức mẫu trong nguyên mẫu khi chúng hiệu quả hơn việc xác định this.foo = function(){}
trong hàm tạo.
vì vậy khi nào tôi muốn sử dụng Name.getName = function() {}? – sepiroth
hoặc đúng hơn, khi nào tôi có thể xác định phương thức (và cách) cho lớp Tên mà không sử dụng định nghĩa mẫu? – sepiroth
'getName' sẽ là một phương thức công khai để bạn định nghĩa nó trên nguyên mẫu chứ không phải tĩnh, bạn sẽ định nghĩa một phương thức tĩnh nếu không có mục đích để làm cho nó công khai hoặc trong nguyên mẫu. –