2013-09-07 34 views
6

Trong php ít nhất trong trường hợp của tôi, nó rất phổ biến để sử dụng các phương pháp ma thuật - ít nhất là khi xác định các lớp cốt lõi của bạn mà từ đó hầu hết mọi thứ khác sẽ mở rộng.Phương pháp ma thuật Javascript

Phương pháp ảo trong hoạt động php theo cách đặc biệt từ tiêu chuẩn của các phương pháp thông thường của bạn. Ví dụ: một trong những phương pháp phổ biến nhất trong sách của tôi để chơi cùng sẽ là __construct()

Cấu trúc được thực thi mỗi lần một lớp được tải. Vì vậy, ví dụ: nếu bạn muốn lớp của bạn tự giới thiệu, bạn có thể làm điều gì đó như sau:

<?php 
class Person 
{ 
    function __construct($name) 
    { 
     $this->name = $name; 
     $this->introduceYourself(); 
    } 

    public function introduceYourself() 
    { 
     //if $this->name then echo $this->name else echo i dont have name 
     echo $this->name ? "hi my name is " . $this->name : "error i dont have name"; 
    } 
} 

$dave = new Person('dave'); 

Thông thường bạn sẽ không chuyển thứ gì đó cho cấu trúc.

Một số những người khác mà tôi chạy ngang qua bán thường bao gồm:

__call() cho phép bạn thay đổi cách mặc định rằng phương pháp này được gọi là. Một ví dụ tốt là ghi đè cho phép bạn nhận các giá trị thuộc tính bất cứ khi nào bạn sử dụng bất kỳ phương thức nào bắt đầu bằng từ nhận được hoặc đặt giá trị thuộc tính bất cứ khi nào cuộc gọi phương thức bắt đầu bằng từ.

__get() được sử dụng làm bộ nạp quá tải cho thuộc tính lớp, tôi không sử dụng nhưng ai đó có thể quan tâm.

__set() được sử dụng làm bộ nạp cho thuộc tính lớp, tôi không sử dụng nhưng ai đó có thể quan tâm.

__destruct() tôi cũng không sử dụng, được gọi ngay khi không có tham chiếu nào khác cho một đối tượng cụ thể hoặc theo bất kỳ thứ tự nào trong chuỗi tắt máy.

Các Câu hỏi

Có phương pháp kỳ diệu như bên này của javascript?

Có bất kỳ đá quý ẩn nào mà một lập trình viên javascript mới cần phải biết giống như những người tôi đã mô tả ở trên cho php không?

+0

Có thể trùng lặp [this] (http://stackoverflow.com/questions/6303896/magic-methods-in-javascript) Ngoài ra hãy xem [tại đây cho \ _ \ _ noSuchMethod \ _ \ _] (http://stackoverflow.com/questions/994143/javascript-getter-for-all-properties). – ComFreek

+0

Có thể, nhưng không có ai làm phiền để trả lời hoặc xác nhận hoặc từ chối những người tôi đang tìm kiếm cụ thể. Hoặc một giải pháp "được mô phỏng". – ajameswolf

Trả lời

8

Nếu bởi "ma thuật" bạn có nghĩa là phương pháp được gọi là ngầm, Javascript có toStringvalueOf:

> foo = {toString: function() { return 'hi' }} 
> foo + " there" 
"hi there" 

> foo = {valueOf: function() { return 100 }} 
> foo - 5 
95 

Tuy nhiên, không có cách nào tiêu chuẩn để xác định lại khai thác (những gì php/python phương pháp kỳ diệu thực sự làm) trong các phiên bản javascript hiện tại. Harmony (Javascript 6) sẽ bao gồm proxies API cho loại công việc này. This blog entry cung cấp các ví dụ và giải thích về proxy, đây là một đoạn trích từ đó mà làm việc tương tự như php của __get:

var p = Proxy.create({ 
    get: function(proxy, name) { 
    return 'Hello, '+ name; 
    } 
}); 
document.write(p.World); // should print 'Hello, World' 

này đã hoạt động trong Firefox, hỗ trợ Chrome có sẵn nếu bạn đi đến about:flags và bật thử nghiệm JavaScript.

+1

Hỗ trợ Chrome khả dụng nếu bạn truy cập 'about: flags' và bật JavaScript thử nghiệm :) Lưu ý' Proxy' cũng có thể làm những gì '__call' thực hiện - và phản ánh chung trong JavaScript rất dễ thực hiện. –

+0

@BenjaminGruenbaum: cảm ơn, đã chỉnh sửa! – georg

1

Để thêm vào câu trả lời @ thg435 của,

Mã bạn đã viết ở trên có thể dễ dàng được viết lại như

// this is your __construct 
var Person = function Person(name) { 
    this.name = name; 
    this.introduceYourself(); 
}; 

// this is public function introduceYourself 
Person.prototype.introduceYourself = function introduceYourself() { 
    this.name 
    ? console.log("hi my name is", this.name) 
    : console.log("error i don't have a name") 
    ; 
}; 

var dave = new Person("dave"); 

Câu trả lời ngắn: có không phải là một nhật ký của ma thuật xảy ra trong JavaScript và (IMO) đó là một điều tốt. Tôi không thích những thứ tiềm ẩn. Một người nhận xét đề cập đến __noSuchMethod__ và yikes! MDN cho biết nó không chuẩn và trang thậm chí còn không biết phiên bản nào của JavaScript hỗ trợ nó.

Bạn có thể quan tâm harmony proxies như một phần của ECMAScript mới 6. Bạn sẽ thấy một số thông tin về Simulating noSuchMethod and doesNotUnderstand

+0

trông giống như một __construct với tôi :) – ajameswolf

+0

Làm thế nào về các __call .. về cơ bản logic nên đi như thế này, nếu một phương pháp không tồn tại trong việc kê khai hoặc chuỗi các nguyên mẫu sau đó thực hiện phương pháp này đi qua trong tên phương pháp gọi là một tham số và các giá trị được truyền dưới dạng mảng cho giá trị thứ hai. – ajameswolf

2

JavaScript là một trong số ít prototypal languages, như là Lua. Nếu bạn đang tìm kiếm constructor, nó được đặt tên như vậy (xem bên dưới). Tất cả các đối tượng trong JavaScript có nguồn gốc từ base-Object.

Hầu như tất cả các câu trả lời của bạn liên quan đến JavaScripts magic- "phương pháp", đã được đưa vào Hidden features of JavaScript. Truy cập trang web StackOverflow này để tìm hiểu thêm một chút về cú pháp và hành vi của JavaScript cũng như các đặc thù, ví dụ liên quan đến comparison operations.

Sau đây là một số thực hành ví dụ để giúp bạn hiểu được những hành vi, (và tài liệu tham khảo tròn khi nói đến serialization của đối tượng JavaScript và nhập khẩu chúng trong PHP).

0 .constructor 
function Number() { [native code] } 

0 .constructor(10) 
>> 10 

var myObj = function(){ console.log("I am a new function"); } 
>> undefined 
myObj.constructor 
>> function Function() { [native code] } 
myObj.constructor() 
>> function anonymous() {} 
myObj.prototype.constructor() 
>> I am a new function 

myObj === myObj.prototype.constructor 
>> true 

x = new myObj 
>> I am a new function 
<< myObj {} 

x.constructor() 
>> I am a new function 
<< undefined 

tôi đã viết một outline of newer language tính năng, nhưng có rất nhiều tài nguyên tuyệt vời khác bao gồm SO, và các liên kết đã được các đồng nghiệp của tôi được cung cấp tại đây.

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