2011-07-29 16 views
22

Tôi đang đọc JavaScript của của Douglas Crockford: Các phần tốt và tôi hơi bối rối về điều gì đó. Trong chương 4, dưới các kiểu Augmenting, anh ta tạo ra một phím tắt để thêm một phương thức.Các loại chuyển tiếp trong JavaScript

Function.prototype.method = function (name, func) { 
    this.prototype[name] = func; 
    return this; 
}; 

Ông nói:

Bằng cách làm tăng Function.prototype với một phương pháp 'phương pháp', chúng tôi không còn phải gõ tên của thuộc tính property. Đó là chút xấu xí bây giờ có thể được ẩn.

Sau đó, anh ta tiếp tục sử dụng phương pháp này để thêm phương thức 'nguyên' vào nguyên mẫu số với điều này.

Number.method('integer', function() { 
    return Math[this < 0 ? 'ceil' : 'floor'](this); 
}); 

document.writeln((-10/3).integer()); // -3 

Tôi là một chút nhầm lẫn ở đây ... bởi vì chúng tôi đã thêm một phương pháp 'phương pháp' cho Chức năng nguyên mẫu, không phải là số nguyên mẫu. Và với kiến ​​thức của tôi, đối tượng Number không thừa kế từ nguyên mẫu Function (mặc dù có lẽ tôi đã sai). Tôi thấy rằng điều này làm việc, nhưng tôi không hiểu tại sao các đối tượng Number có thể sử dụng phương thức 'method' này để thêm ... phương thức.

+0

Đây là một câu hỏi hay.Phải mất một thời gian tôi mới hiểu được mã nhưng cuối cùng tôi đã nhận được nó. – Paul

+0

cảm ơn tất cả vì những câu trả lời hay. điều đó có ý nghĩa bây giờ. –

+2

Câu hỏi tiếp theo của tôi là điểm của bit đầu tiên là gì. Tôi đoán tôi không hiểu câu nói của anh ấy. Phương pháp 'phương pháp' này hiệu quả hơn hay tốt hơn cách trực tiếp thêm phương thức vào nguyên mẫu Số trực tiếp như thế nào? Như thế này: Number.prototype.integer = function() { trả lại Toán [this <0? 'ceil': 'floor'] (điều này); } –

Trả lời

4

Number là trong thực tế một hàm. Bất kỳ hàm tạo nào là hàm.

Một cách để suy nghĩ về các loại trong javascript là để nói rằng một loại chỉ là một hàm Foo có thuộc tính .prototype. Đây là nguyên mẫu của bất kỳ đối tượng nào được tạo bằng từ khóa new, như trong new Foo(). Theo quy ước Foo được viết hoa để cho biết rằng đó là một hàm tạo.

2

Dưới đây là một ví dụ có thể giúp:

var num = Number('1.2'); 
alert(num instanceof Number); // true 
alert(num instanceof Function); // false 
alert(Number instanceof Number); // false 
alert(Number instanceof Function); // true 

Một cách khác để suy nghĩ về nó là trong Javascript Function kéo hai nhiệm vụ như kiểu lớp - kiểu loại. Vì vậy, đây là cách thêm phương thức vào các loại.

+1

'alert (num instanceof Number);' Cái này là 'false'. – ChandlerQ

+0

@AmareKnight: Vâng ... crap. Đó là một "tính năng" từ Java mà tôi không cần. –

3
Function.prototype.method = function (name, func) { 
    this.prototype[name] = func; 
    return this; 
}; 

Cũng trong câu lệnh này, bạn đã tạo phương thức được gọi là phương thức có thể truy cập được đối với tất cả các đối tượng thông qua sự thừa kế nguyên mẫu. Các hàm bắt nguồn từ Function.prototype có nguồn gốc từ Object.prototype. Vì vậy, các chuỗi và số sẽ có thể truy cập phương thức Object.prototype được gọi là phương thức trong khai báo này.

Number.method('integer', function() { 
    return Math[this < 0 ? 'ceil' : 'floor'](this); 
    }); 

document.writeln((-10/3).integer()); // -3 

Trong khối thứ hai này, bạn về cơ bản cách gọi phương thức đó là đã có sẵn trong các mẫu đối tượng và đi qua các thông số cần thiết trong này tên trường hợp = 'nguyên' và giá trị tương đương với

function() { 
    return Math[this < 0 ? 'ceil' : 'floor'](this); 
    }); 

Cuối cùng trong tuyên bố cuối cùng, bạn chuyển vào cặp giá trị tên cho kết quả của -3

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