Javascript原型是否类似于PHP静态方法?

时间:2013-03-25 05:30:07

标签: php javascript

我正在学习一些Javascript,但我对prototype

有疑问

在这种情况下,原型是否类似于PHP静态方法,因为所有实例共享它?

的Javascript

var Person = function(){
   this.name = "Test Person";
}

Person.prototype.work = function(){
   return this.name + "is working";
}

PHP

class Person($personName){

   public static working(){
      return $personName . "is working";
   }
}

$person1 = new Person("Joe").working();
$person2 = new Person("Mike").wokring();

2 个答案:

答案 0 :(得分:2)

不是,不。我建议您阅读Doug Crockford's article on Prototypal Inheritance以了解x.prototype在Javascript中的含义,以及它与更多“经典”继承的关系。维基百科也有an entry可以帮助你理解这个概念。

答案 1 :(得分:2)

技术答案是否定的。原型函数的底层实现与类C语言中静态方法的实现不同。

...但是,在实践中,您可以将其一般用法视为与public-static方法类似 与公共静态成员相比,更类似的是原型属性。

它们不是以相同的方式调用,而是位于“类”/构造函数上的方法或属性的概念,并且每个实例都可以访问它们,并将这些值修改为共享值,从而影响所有其他实例实例非常非常像public static

但是还有一些其他的事情要记住,这将与您认为public static的功能一致,具体取决于您使用的语言......

当然,最重要的是,就原型功能而言,他们绝对 无法访问任何私有/特定于实例的状态,这些状态不可公开访问
因此,如果您习惯于处理可能能够调用私有方法或使用特定于实例的变量(不是公共成员)的public static函数,那么您将失去120%的运气。

要考虑的第二件事是你也可以通过闭包创建公共和私有静态成员/方法的等价物。

var Class = (function () {
    var private_static_method = function () {},
        public_static_method  = function () {},
        private_static_property = 1,
        public_static_property = 2,

        class_constructor = function (a, b) {
            var private_method = function () {},
                public_method  = function () {},
                public_property  = a,
                private_property = b,

                public_interface = {
                    method   : public_method,
                    property : public_property
                };

            return public_interface;
        };

    class_constructor.method   = public_static_method;
    class_constructor.property = public_static_property;
    return class_constructor;
}());

现在,通过关闭,我得到了“私有静态”函数和属性,每个私有实例都可以访问它们 我有公共静态方法,我已将其作为构造函数的方法附加 然后我得到了不使用new的构造函数,只创建了一个新对象(public_interface),它附加了你想要的任何东西。
由于闭包,实例的任何公共方法都可以访问该实例的任何私有方法/变量。

这些都与传统课程无关 但是从纯粹的基于闭包的角度来看,这就是你可以重新创建所有这些访问类型的方法,而不会让自己疯狂,试图将类变成JS。