6

至少在我的例子中,在 php 中,使用魔术方法是很常见的——至少在定义你的核心类时,大多数其他东西都将从中扩展。

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 开头的方法时获取属性值,或者在方法调用以单词 set 开头时设置属性值。

__get() 用作类属性的过度加载器,我不使用,但有人可能会感兴趣。

__set() 用作类属性的重载器,我不使用,但有人可能会感兴趣。

__destruct() 我也不使用,只要没有对特定对象的其他引用,或者在关闭序列期间以任何顺序调用,就会调用。

问题

javascript里面有这样的魔法方法吗?

是否有任何隐藏的宝石是新的 javascript 程序员应该知道的,就像我上面为 php 描述的那些?

4

2 回答 2

8

如果“魔术”是指隐式调用的方法,则 Javascript 具有toStringand valueOf

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

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

但是,在当前的 javascript 版本中,没有标准的方法来重新定义运算符(php/python 魔术方法实际上是做什么的)。Harmony (Javascript 6) 将包含此类工作的代理 API 。这个博客条目提供了关于代理的示例和解释,这里有一个类似于 php 的片段__get

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

这已经在 Firefox 中有效,如果您about:flags打开实验性 JavaScript,则可以使用 Chrome 支持。

于 2013-09-07T17:22:24.927 回答
2

JavaScript 是少数原型语言之一,Lua 也是如此。如果您正在寻找constructor,它被命名为这样(见下文)。JavaScript 中的所有对象都派生自base-Object

几乎所有关于 JavaScript 魔法“方法”的答案都已包含在JavaScript 的隐藏特性中。访问这个 StackOverflow 站点,了解更多关于 JavaScript 的语法和行为以及特性,例如比较操作

以下是一些可帮助您理解行为的动手示例(以及在 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

我写了一个新语言特性的大纲,但是还有许多其他很棒的资源,包括 SO,以及我的同行已经在这里提供的链接。

于 2013-09-07T18:15:15.017 回答