2013-09-07 5 views
6

В php, по крайней мере, в моем примере, очень часто используются магические методы - по крайней мере, при определении основных классов, из которых больше всего будет распространяться больше всего.Магические методы Javascript

Магические методы в php действуют особым образом из нормы ваших обычных методов. Например, одним из наиболее распространенных методов в моей книге для игры будет __construct()

Конструкция выполняется каждый раз, когда класс загружен. Так, например, если вы хотите свой класс, чтобы представить себя вы могли бы сделать что-то вроде этого:

<?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'); 

Обычно вы бы не передать что-то в конструкции.

Некоторые другие те, которые я бегу по полу обычно включают в себя:

__call(), который позволяет изменить путь по умолчанию, методы называются. Хорошим примером является переопределение, которое позволяет получать значения атрибутов всякий раз, когда вы используете какой-либо метод, начинающийся с слова get, или задание значений атрибутов всякий раз, когда вызов метода начинается с набора слов.

__get(), используемый как дополнительный загрузчик для атрибутов класса, я не использую, но кому-то может быть интересно.

__set(), используемый как перегружатель для атрибутов класса, я не использую, но кому-то может быть интересно.

__destruct() Я также не использую, вызывается, как только нет других ссылок на конкретный объект или в любом порядке во время последовательности выключения.

Вопрос

Существуют магические методы, как это внутри JavaScript?

Есть ли скрытые драгоценные камни, о которых должен знать новый javascript-программист, как те, которые я описал выше для php?

+0

Возможный дубликат [this] (http://stackoverflow.com/questions/6303896/magic-methods-in-javascript) Также посмотрите [здесь для \ _ \ _ noSuchMethod \ _ \ _] (http://stackoverflow.com/questions/994143/javascript-getter-for-all-properties). – ComFreek

+0

Возможно, но никто не потрудился ответить или подтвердить или опровергнуть тех, кого я ищу специально. Или «эмулированное» решение. – ajameswolf

ответ

8

Если под «магии» вы имеете в виду методы, которые вызываются неявно, Javascript имеет toString и valueOf:

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

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

Однако, нет никакого стандартного способа переопределить операторов (что PHP/Python магические методы фактически делают) в текущих версиях javascript. Harmony (Javascript 6) будет включать proxies API для такого рода работ. This blog entry приводятся примеры и объяснения на Proxies, вот отрывок из там работает аналогично РНР __get:

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

Это уже работает в Firefox, поддержка Chrome доступна, если вы идете в about:flags и включите экспериментальную JavaScript.

+1

Поддержка Chrome доступна, если вы перейдете к 'about: flags' и включите экспериментальный JavaScript :) Примечание.' Proxy' также может делать то, что делает '__call', и в целом отражение в JavaScript очень легко выполнить. –

+0

@BenjaminGruenbaum: спасибо, отредактирован! – georg

1

Чтобы добавить @ thg435 Ответим,

Код, который вы написали выше, можно легко переписать в виде

// 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"); 

Короткий ответ: там не лаг магии происходит в JavaScript и (IMO) это хорошая вещь. Мне не нравятся неявные вещи. Один комментатор упоминает __noSuchMethod__ и yikes! MDN говорит, что он нестандартен, и страница даже не знает, какие версии JavaScript поддерживают его.

Вы могли бы быть заинтересованы в harmony proxies как часть нового ECMAScript 6. Вы увидите некоторую информацию о Simulating noSuchMethod and doesNotUnderstand

+0

выглядит как __construct для меня :) – ajameswolf

+0

Как насчет __call .. по существу логика должна идти так, если метод не существует в объявлении или цепочке прототипов, тогда выполните этот метод, передав имя вызываемого метода как один параметр и переданные значения в качестве массива для второго значения. – ajameswolf

2

JavaScript является одним из немногих prototypal languages, как Lua. Если вы ищете constructor, он называется таким (см. Ниже). Все объекты в JavaScript получены из base-Object.

Практически все ваши ответы в отношении JavaScripts magic- "methods" уже включены в Hidden features of JavaScript. Посетите этот сайт StackOverflow, чтобы узнать немного больше о синтаксисе и поведении JavaScript, а также об особенностях, например, в отношении comparison operations.

Ниже приведены некоторые практические примеры, которые помогут вам понять поведение (и круговые ссылки, когда дело доходит до сериализации объектов JavaScript и импортирования их в 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 

Я написал outline of newer language особенности, но есть много других больших ресурсов, включая SO, и ссылки, уже предоставленные моими коллегами здесь.

Смежные вопросы