首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript魔术方法

Javascript魔术方法
EN

Stack Overflow用户
提问于 2013-09-07 17:04:19
回答 2查看 5.2K关注 0票数 6

在php中--至少在我的例子中--使用神奇的方法是非常常见的--至少在定义核心类时是如此,因为大多数其他东西都是从这些类扩展而来的。

php中的魔术方法以一种不同于常规方法的特殊方式工作。例如,我书中最常用的方法之一是__construct()

每次加载类时都会执行该构造。因此,例如,如果您希望您的类自我介绍,您可以这样做:

代码语言:javascript
复制
<?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那样?

EN

回答 2

Stack Overflow用户

发布于 2013-09-07 17:22:24

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

代码语言:javascript
复制
> foo = {toString: function() { return 'hi' }}
> foo + " there"
"hi there"

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

然而,在当前的javascript版本中,没有标准的方法来重新定义操作符( php/python魔术方法实际上所做的)。和谐(Javascript 6)将包括代理API为这类工作。这个博客条目提供了关于代理的示例和解释,下面是一个类似于php的__get的代码片段

代码语言:javascript
复制
var p = Proxy.create({
  get: function(proxy, name) {
    return 'Hello, '+ name;
  }
});
document.write(p.World); // should print 'Hello, World'

这已经适用于火狐,如果你转到about:flags并打开实验性的JavaScript,Chrome支持是可用的。

票数 8
EN

Stack Overflow用户

发布于 2013-09-07 18:15:15

JavaScript是为数不多的原型语言之一,Lua也是。如果您正在寻找constructor,那么它就是这样命名的(参见下面)。JavaScript中的所有对象都是从Object派生的。

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

下面是一些亲自操作的示例,帮助您理解行为(以及在序列化JavaScript对象并在PHP中导入它们时的循环引用)。

代码语言:javascript
复制
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,以及这里的同行已经提供的链接。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18675788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档