在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开头的任何方法时获取属性值,或者在方法调用以单词集开始时设置属性值。
__get()作为类属性的过载器,我不使用,但可能有人感兴趣。
__set()作为类属性的过载器,我不使用,但可能有人感兴趣。
__destruct()我也不使用,在关闭过程中,如果没有对特定对象的其他引用,也不会按任何顺序调用。
问题
在javascript中有像这样的神奇方法吗?
是否有新的javascript程序员应该注意到的隐藏宝石,就像我前面描述的php那样?
发布于 2013-09-07 17:22:24
如果“魔术”指的是隐式调用的方法,则Javascript具有toString和valueOf。
> 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的代码片段
var p = Proxy.create({
get: function(proxy, name) {
return 'Hello, '+ name;
}
});
document.write(p.World); // should print 'Hello, World'这已经适用于火狐,如果你转到about:flags并打开实验性的JavaScript,Chrome支持是可用的。
发布于 2013-09-07 18:15:15
JavaScript是为数不多的原型语言之一,Lua也是。如果您正在寻找constructor,那么它就是这样命名的(参见下面)。JavaScript中的所有对象都是从Object派生的。
几乎所有关于JavaScripts魔术的答案--“方法”,都已经包含在JavaScript的隐藏特征中了。访问这个StackOverflow站点,了解更多有关比较操作语法和行为以及特性的知识。
下面是一些亲自操作的示例,帮助您理解行为(以及在序列化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,以及这里的同行已经提供的链接。
https://stackoverflow.com/questions/18675788
复制相似问题