例如在PHP中
class foo{
function foo($name){ //constructor
$this->name=$name;
}
function sayMyName(){
return $this->name;
}
}
class bar extends foo{
function sayMyName(){
return "subclassed ".$this->name;
}
}
在JS中
function foo(name){
this.name=name;
}
foo.prototype.sayMyName=function(){return this.name};
function bar(){}
bar.prototype=new foo();
bar.prototype.sayMyName=function(){return "subclassed "+this.name};
我是javascript的新手,所以请赐教,不是它们功能相同,还是我错过了一些巨大的东西?
如果它们是相同的,那么经典与原型有何不同?
提前感谢...
答案 0 :(得分:6)
在JavaScript中,您可以在程序运行时更改继承,这是您在经典编程中无法做到的。例如:
function foo(name){
this.name=name;
}
foo.prototype.sayMyName=function(){return this.name};
function foo2(name){
this.name = name;
}
foo2.prototype.sayMyName = function(){return "My name is "+this.name;};
function bar(){}
bar.prototype = new foo();
var myBar = new bar();
myBar.name = "Marius";
alert(myBar.sayMyName());
bar.prototype = new foo2();
var myBar2 = new bar();
myBar2.name = "Marius";
alert(myBar2.sayMyName());
答案 1 :(得分:2)
JavaScript(正如您指出的那样)使用prototype based的特定类型的OOP。在JavaScript中,您不创建类,只需克隆现有对象并通过向其原型添加成员来扩充它们。
在PHP中,您创建的类是新对象的蓝图。
答案 2 :(得分:2)
我向安德鲁·黑尔和马吕斯保证。通过在运行时修改类,可以改变类的功能。经典OOP不允许您这样做,您必须准确指定类/对象可以执行的操作以及在编译之前或解释之前它具有的数据属性(如果是解释语言)。
您提供的代码在功能上是相同的,但这只是因为您没有利用JS中的原型。
答案 3 :(得分:0)