2015-01-26 14 views
5

Sau đây là một đoạn mã từ Javascript Crockford: The Good Parts:Mặc nhiên thêm các phương pháp để nguyên mẫu nhà xây dựng trong JavaScript

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

Crockford đi vào giải thích rằng

"Bằng cách làm tăng chức năng. 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 tài sản nguyên mẫu. Đó là bit xấu xí bây giờ có thể được ẩn. "

Về cơ bản, tôi không hiểu điểm này. Chúng ta phải làm gì trước khi chúng ta không còn phải làm gì nữa?

+3

Chạm vào nguyên mẫu của thứ bạn không sở hữu là một ý tưởng khủng khiếp (bạn mở cửa cho tất cả các loại xung đột). Đây là một chút biếng nhác đáng kinh ngạc về sự lười biếng trên phần của Crockford. – ssube

+1

Việc "cải thiện" được thực hiện ở đó không thực sự có tầm quan trọng thực tiễn nhiều; Tôi nghĩ đó là một ví dụ về giảng dạy. – Pointy

+0

@ssube: Crockford "không thông báo"? meh. nếu đó là vấn đề, hãy chỉ cho chúng tôi thay vì nói cho chúng tôi ... – dandavis

Trả lời

9

Anh ấy nói rằng thay vì viết:

MyType.prototype.myMethod = function() { 
    .. 
}; 

bạn có thể viết này:

MyType.method("myMethod", function() { 
    ... 
}); 

với khả năng (trao return this) của dot-chaining cuộc gọi khác:

MyType.method("method1", function() { 
    ... 
}).method("method2", function() { 
    ... 
}); 

Meh.

2

Mã phá vỡ:

Function.prototype.method 

Mỗi đối tượng trong JavaScript cho phép nguyên mẫu. Đó là cách thừa kế JavaScript. Chức năng là master object từ đó tất cả các chức năng khác được tạo. Khi bạn thiết lập một mẫu thử nghiệm trên tất cả các đối tượng Hàm kế thừa thuộc tính đó. Trong trường hợp này, hàm method.

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

Nếu bạn muốn mở rộng của riêng functions với các phương pháp khác mà bạn cần phải gõ:

somefunction.prototype.name = function(){} 

Với phương pháp này bạn có thể làm chỉ này:

somefunction.method(name, function) 

chút sôi nổi này không rằng:

this.prototype[name] = func; 

Nó dùng để chỉ đối tượng Hàm sử dụng từ khóa this. Tiền thu được từ nguyên mẫu thừa kế. Đặt chức năng cho mẫu thử nghiệm bằng cách sử dụng [name]. Điều này chuyển đổi tên chuỗi thành thuộc tính. Tại sao như vậy? Bởi vì:

this.prototype.name 

sẽ không hoạt động bình thường. Nếu bạn sử dụng mã ở trên, mỗi lần method mới được thêm vào, nó sẽ được tham chiếu bởi name chứ không phải tên bạn đã chọn.

Tại sao là prototype[example] giống như prototype.example. Bởi vì trong JavaScript mọi thuộc tính được lưu trữ trong một danh sách mảng trên đối tượng và có thể được gọi như bạn gọi một mục từ một mảng bằng cách sử dụng Object [].

1

Hãy chứng minh tuyên bố corckford của:

"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 longerhave để gõ tên của thuộc tính prototype Đó chút xấu xa có thể bây giờ. được giấu đi."

Đây Crockford muốn nói rằng bạn có thể thao tác Function.prototype để đạt được nhiều chức năng khác nhau cho usage.It cá nhân của bạn là một chức năng bổ sung vào function.prototype để thêm phương pháp mới/tài sản cho bất kỳ chức năng .Functions trong javascript kế thừa hình thức Function.prototype.lets phá vỡ mã của bạn.

Function.prototype.method = function (tên, func) {

trong dòng này Function.prototype được thêm một phương pháp mới method.This nhận hai đối số. name satands cho một tên phương pháp mới.Và func là viết tắt của chức năng của nó.Tôi nghĩ rằng bạn đã quen thuộc với phương pháp và các thuộc tính là gì. Các hàm là đối tượng lớp đầu tiên trong javascript. Do đó chúng có thể được thêm các thuộc tính và phương thức mới trong suốt thời gian chạy.

this.prototype [name] = func;

Đây này đề cập đến các chức năng mà gọi nó. [name] là tên phương pháp và func được chức năng của phương pháp này cho biết thêm một phương pháp mới để chức năng thông qua sử dụng array notation. Sau đó, cuối cùng

trở lại đây;

với tuyên bố này chức năng thông qua được trả về với một phương pháp mới được thêm vào nó.

Ở đây tôi có một ví dụ thực tiễn cho bạn:

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

function Myfunction(){  // a constructor function called Myfunction 
    this.name='robin';  // it has a name property 
} 

Myfunction.method('mymethod',function(){ console.log(' i am available')}); //adds a method named 'mymethod to Myfunction constructor 

var newObj=new Myfunction();  // creates a new instance of Myfunction class 
console.log(newObj.mymethod()); //calls mymethod() of newObj 

Dưới đây là một myfunction constructor.We có thể thêm các phương pháp di truyền để nguyên mẫu của constructor này usind Myfunction.prototype.mymethod=function(){ ..}

Nếu bạn sử dụng myfunction như a hàm tạo đây là cách bạn thêm phương thức vào nó.But Như bạn đã thêm một chức năng mới đến Chức năng.nguyên mẫu, bạn chỉ có thể gọi nó như

Myfunction.method('mymethod',function(){console.log('i am available'}); //it will add a method named mymethod to Myfunction's prototype 

Tuyên bố này sẽ thêm một phương pháp mới được gọi là mymethod-Myfunction()'s prototypengầm.

vì vậy bạn không phải viết Myfunction.prototype.mymethod=function(){ console.log('i am available'); .Instead bạn có thể viết Myfunction.method('mymethod',function(){ console.log('i am available'});

Vì vậy, nó chứng tỏ nó sẽ giảm từ bạn viết Myfunction.prototype một lần nữa và một lần nữa mỗi khi bạn muốn thêm các phương pháp mới để Hàm tạo hàm của tôi.

Vì vậy, nó chứng minh số tuyên bố của crockford.

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