1

我正在学习一些 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();
4

2 回答 2

2

不是真的,不。我建议阅读Doug Crockford 关于原型继承的文章,以了解x.prototypeJavascript 中的含义,以及它如何与更“经典”的继承相关联。维基百科也有一个条目可以帮助你理解这个概念。

于 2013-03-25T05:33:56.100 回答
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 中。

于 2013-03-25T05:50:46.940 回答