Javascript 相当于 PHP 的::(范围解析运算符)

标签 javascript php class oop scope-resolution

在 PHP 中,您可以这样做:

class myClass() {
    function doSomething(someVar) {
         // do something here
    }
    // etc... (other methods and properties)
}

然后,当然,您可以在实例化该类之后调用该方法,如下所示:

$myObj = new myClass();
$myObj->doSomething();

但您也可以选择将该方法作为独立函数调用,而无需实例化该类(但您必须注意该函数中的依赖项),如下所示:

myClass::doSomething();

我相信这是为 C++ 借来的东西... 它被称为范围解析运算符(PHP 代码中的 Paamayim Nekudotayim ...)
http://en.wikipedia.org/wiki/Scope_resolution_operator#PHP
http://www.php.net/manual/en/language.oop5.paamayim-nekudotayim.php

你会如何在 JavaScript 中做这样的事情?这似乎是不可能的。 也许我以错误的方式处理这个问题,我应该公开我正在努力实现的目标......

我只是有一个函数,它是这样的:

function submitContactForm(form) {
    // pretty JavaScript...
}

我很高兴它是一个函数。但我想实现一个“resetContactForm()”,但希望以某种方式将它附加到 submitConatctForm 函数。

我知道我可能会这样做:

var contactForm = {
   "submit" : function(form) {
       //...
   },
   "reset" : function(form) {
       //...
   }
}

我会这样回答我自己的问题...

但是,除了我不喜欢这种语法并且想避免使用它之外,还有一个事实是上面的结构不能用作类定义,它与 PHP 中的不一样。 ..所以回到最初的问题:有没有一种方法可以让 JavaScript 结构同时用作类定义和独立函数的集合?

最佳答案

您误解了原型(prototype)继承 - 您实际上可以将第二个示例用作“类”定义,并且可以从“类”或“实例”调用方法:

// This is a normal JavaScript object
// not JSON as another commenter pointed out.
var ContactForm = {
   submit: function(form) {
       form = form || this.form;
       // general contact form submission implementation
   },
   reset: function(form) {
       form = form || this.form;
       // general contact form reset implementation
   },
   setForm: function(form) {
       this.form = form;
   }
};

// Now we will create an instance of the contactForm "class"
// We are setting the prototype of `firstContactForm`
// to point at the `contactForm` object.
// If we wanted to we could create a function on the
// ContactForm object (e. g. `create`) that would invoke
// Object.create for us. (i. e. `ContactForm.create()`)
var firstContactForm = Object.create(ContactForm);
firstForm.setForm(document.getElementById("someForm"));
firstForm.reset();

 // But, we can also use the function as a "static":
 ContactForm.reset(document.getElementById("someForm"));

在回答你问题的另一部分时,如果你想让它成为可调用的“独立”的东西,你也可以允许直接传入数据,就像我们在示例中所做的那样 表格=表格|| this.form; 检查 submitreset

或者,您可以使用 callapply ( as @elclanrs points out in his answer ) 并始终使用 this.form:

 ContactForm.reset.call({form: document.getElementById("someForm")});

关于Javascript 相当于 PHP 的::(范围解析运算符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20956760/

相关文章:

javascript - 必须在事件触发之前写入警报

javascript - 关于使用 useContext 和 useReducer 钩子(Hook)的问题

php - 使用 PDO - Php 登录

php - 创建 PHP 页面的自定义响应

java - 获取对象调用方法

c# - 是否有任何扩展或方法可以像在 VS 中一样在 VS Code 中添加 C# 类?

javascript - 如何通过dojo检测textarea的变化

php - 如何正确结束用户 session ?

php - OOP(php)在另一个类中实例化类

javascript - 在简单的指令示例中嵌入用法