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