解决方案:不.你不能这样做.使用&&进行链命令并完成它.
tl; dr:in random.function("blah").check(),check()如果function("blah")返回false ,如何忽略它?或者这甚至可能吗?
的背景:
好的,所以我对代码很可怕.但是我试图通过编码使我的生活变得轻松的事情来拖延.而我的勉强,我的意思是显微镜.所以基本上,我的整个项目都是基于对象和插件.(插件是包含对象的附加.js文件.例如,afk.js看起来像这样:
global.afk = function(){};
afk.check = function(){ ... };
Run Code Online (Sandbox Code Playgroud)
通过加载该js文件,我可以访问afk对象及其中的所有功能.可能效率不高,但它有效,它可以确定哪些功能更容易做到.
回到拖延位.因为我不知道加载了什么插件,在一些共享核心.js文件中,有这些条件语句:if (plugin.has("afk")) { afk.check(); };但是,我感到无聊并plugin.has()返回实际对象而不是'true',所以我可以这样做:
plugin.has("afk").check();
Run Code Online (Sandbox Code Playgroud)
它按预期工作.除非没有afk插件,否则会抛出"false has no method check"的明显错误.
就是这样.有任何想法吗?此外,如果您有任何疑虑,请告诉我.我知道我做了很多错误/效率低下的事情,而且当我弄清楚它时修复它们很好.
这是我的用例
getSomeFields(persons, fields){
let personsWithSpecificFields = [];
_.each(persons, (person) => {
let personSpecificFields = {};
_.each(fields, (field) => {
// here im thinking to modify the field to match the method name
// ( if something like __call as in php is available)
// e.g. field is first_name and i want to change it to getFirstName
personSpecificFields[field] = person[field]();
});
personsWithSpecificFields.push(personSpecificFields);
});
return personsWithSpecificFields;
}
Run Code Online (Sandbox Code Playgroud)
这是我的 person class
import _ from 'lodash';
export default class Person{
// not working..
__noSuchMethod__(funcName, …Run Code Online (Sandbox Code Playgroud) 在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');
Run Code Online (Sandbox Code Playgroud)
通常,您不会将某些内容传递给构造.
我经常遇到的其他一些包括:
__call()允许您更改调用方法的默认方式.一个很好的例子是覆盖,它允许您在使用任何以单词get开头的方法时获取属性值,或者在方法调用以单词set开始时设置属性值.
__get()用作类属性的重载,我不使用,但有人可能会感兴趣.
__set()用作类属性的重载,我不使用,但有人可能会感兴趣.
__destruct()我也不使用,只要没有对特定对象的其他引用,或在关闭序列期间以任何顺序调用.
问题
在javascript里面有这样的神奇方法吗?
有新的javascript程序员应该知道的任何隐藏的宝石,就像我上面描述的PHP吗?
考虑这个JavaScript代码:
var x = new date()
// "ReferenceError: date is not defined" - useful error, hints at a typo ('D'ate)
var x = new MyClass.foo()
// "TypeError: undefined is not a function" - bad error, no hint it might be 'F'oo
Run Code Online (Sandbox Code Playgroud)
错误本身是正确的,因为MyClass没有foo方法,所以MyClass.foo确实返回undefined,并且new不喜欢它.问题是这并没有暗示用户可能拼错了方法名称.现实生活中的例子:
new Meteor.collection('foo') // instead of:
new Meteor.Collection('foo') // c and C look alike with many fonts at small size
Run Code Online (Sandbox Code Playgroud)
是否有一个便携式检测到的对象没有方法的方法之前 new被undefined传递给它,自动?__noSuchMethod__ …
我想知道是否有一种方法可以模仿 Node.js 中 PHP 的神奇方法 __get() 和 __set()。从这个问题:JavaScript getter for allproperty我知道你可以在Rhino中做到这一点,但Node是建立在V8之上的。V8有办法做到这一点吗?
javascript ×5
node.js ×2
object ×2
php ×2
v8 ×2
ecmascript-6 ×1
function ×1
methods ×1
prototype ×1