2010-07-31 66 views
43

Ai đó có thể cho tôi ví dụ về xác thực nhập văn bản bằng Duck trong Javascript? Tôi đang khám phá OO javascript và tôi đã nghe nói về gõ vịt nhưng không thể nhìn thấy bất kỳ ví dụ về nó đang được sử dụng trong javascript.Nhập văn bản vào Javascript

+3

vịt gõ không hoạt động rất tốt trong javascript- đối tượng của bạn có thể quack như một số dấu chấm động, nhưng nó có thể cũng giống như có khả năng quack như một chuỗi hoặc một boolean. – kennebec

+1

http://stackoverflow.com/a/12763070/822138 có một số ví dụ và thảo luận hay. – sam

Trả lời

21

Liên kết thứ hai đưa ra ví dụ về kiểu mẫu giống như kiểu gõ chữ trong js. Không nói rằng tôi khuyên bạn nên làm điều này, nhưng ... tốt, bạn yêu cầu nó. ;)

Trong lập trình máy tính với ngôn ngữ lập trình hướng đối tượng, vịt gõ là một phong cách năng động gõ vào đó dòng bộ của một đối tượng của phương pháp và tài sản xác định ngữ nghĩa có giá trị, chứ không phải hơn các sản phẩm kế thừa từ một lớp cụ thể hoặc triển khai giao diện cụ thể.

Wikipedia - Duck typing

Phương pháp đơn giản nhất là để xác định hợp đồng không chính thức và chỉ cần dựa vào các nhà phát triển ở mỗi bên của giao diện biết những gì họ đang làm. Dave Thomas đã đưa ra cách tiếp cận này tên của "đánh máy vịt" —nếu nó đi như một con vịt và nó quacks giống như một con vịt, thì đó là một con vịt. Tương tự với giao diện Shape của chúng tôi, nếu nó có thể tính toán khu vực và chu vi, thì đó là Shape.

JavaScript Interfaces and Duck Typing

+0

Rực rỡ, cảm ơn câu trả lời. Bây giờ tôi hiểu tôi nghĩ rằng tôi sẽ dính vào thừa kế tiêu chuẩn của tôi bằng cách sử dụng chuỗi nguyên mẫu. –

+0

Ví dụ js trong wikipedia, không kiểm tra bất kỳ "lượt đi" nào và "truy vấn" !! Chẳng phải ví dụ đó sẽ được cập nhật? – eminemence

108

Nguyên tắc của "Duck Typing" là

Nếu nó trông giống như một con vịt, bơi như một con vịt, và quacks như một con vịt, sau đó nó có thể là một con vịt.

Trong ngôn ngữ lập trình hướng đối tượng (C++) để làm cho cả hai đối tượng trông giống như một con vịt, bạn phải kế thừa lớp của chúng từ một lớp "giao diện" chung, do đó trình biên dịch sẽ cho phép bạn gọi duck phương pháp trên chúng. Đó được gọi là gõ mạnh.

Bây giờ đây là cách nó được thực hiện trong Javascript:

var duck = { 
    appearance: "feathers", 
    quack: function duck_quack(what) { 
     print(what + " quack-quack!"); 
    }, 
    color: "black" 
}; 

var someAnimal = { 
    appearance: "feathers", 
    quack: function animal_quack(what) { 
     print(what + " whoof-whoof!"); 
    }, 
    eyes: "yellow" 
}; 

function check(who) { 
    if ((who.appearance == "feathers") && (typeof who.quack == "function")) { 
     who.quack("I look like a duck!\n"); 
     return true; 
    } 
    return false; 
} 

check(duck); // true 
check(someAnimal); // true 

Nầy, check chức năng kiểm tra xem các đối tượng thông qua trông giống như một con vịt (nó sẽ kiểm tra sự xuất hiện và khả năng quack). Chúng tôi chuyển hai đối tượng khác nhau cho nó và nó sẽ trả về true trên cả hai. Bên cạnh sự xuất hiện và quacking chúng có thể là những thứ hoàn toàn khác nhau, nhưng trong hàm này, chúng hoạt động theo cùng một cách (có giao diện chung), chúng trông giống như một "con vịt". Chúng ta có thể gọi phương thức quack trên cả hai đối tượng (và ai quan tâm đến chúng thực sự là gì).

+4

Tôi cũng muốn thấy dấu màu xanh trên câu trả lời này :-) Sạch sẽ và đơn giản – Thabung

+1

Câu trả lời rất hay – Willa

+1

Rất tốt giải thích. Cảm ơn :) – rajugaadu

1

Ví dụ về nhập vịt trong JavaScript là iterables. JavaScript thực sự không có loại được gọi là Iterable, nhưng nó có định nghĩa cho một đối tượng, có thể lặp lại được.

Để có iterable, một đối tượng phải thực hiện các phương pháp @@ iterator

Đây là yêu cầu để gõ vịt. Nếu một đối tượng thực hiện một phương thức, được định nghĩa trong một giao diện, đối tượng có thể được sử dụng ở những nơi mà kiểu giao diện được chấp nhận. Đối với iterables đây là trường hợp trong vòng

for (let value of iterable) { 
} 

và mảng

[...iterable] 
Các vấn đề liên quan