subclass.prototype = new superclass()vs. subclass = new superclass()

时间:2010-01-22 13:52:17

标签: javascript

我一直在使用

在javascript中实例化子类
object = new class ()

但我注意到有些人使用

进行实例化
object.prototype = new class ()

问题:有什么区别?对我来说,似乎后者更多地尊重继承链,因为如果class ()有一堆“this.variable = x”语句,而对象是你想从它继承而不是类的实例,您正准确地将这些变量分配给对象的原型而不是像前一种情况那样分配给对象本身。所以实际上它是这样的?

object = new class () |vs.| subclass.prototype = new superclass ()

但是,程序中的功能都相同?

附带问题:我还不清楚new运算符实际上做了什么。在我看来,只需创建一个空对象并分配它的 proto 属性?

3 个答案:

答案 0 :(得分:12)

答案 1 :(得分:5)

不同之处在于:

var subclass = new superclass();

您正在创建superclass的实例。 subclass只是变数。您没有创建子类(即使subclass继承superclass)。 在后一个例子中,假设子类是一个函数,你要说子类的所有新实例都应该继承(即。子类)superclass

所以:

function superclass() {this.stuff="stuff";}
function subclass() {}
subclass.prototype = new superclass();
alert(new subclass().this); // pops up "stuff"

是典型的继承。

对于new运算符,它用于创建内置对象和用户定义类型的实例。用户定义的类型只是一个函数。

修改 当我在上面写的那个子类继承使用原型继承的超类型时,我的意思是所有子类的新实例都继承自超强类的一个特定实例,而不是来自superclass类型/功能本身。

答案 2 :(得分:2)

阅读mozilla doc

后,分享Javascript继承的快速演示
function Employee (name, dept) {
    this.name = name || "";
    this.dept = dept || "";
}

function Programmer (name, projs) {
    Employee.call(this, name, "programming");
    this.projects = projs || [];
}
Programmer.prototype = new Employee;

// demo dynamic inheritance
Employee.prototype.leave = 10;

var johnny = new Programmer("Johnny", ["C#","Java"]);
alert("name: " + johnny.name + "\n"
      + "dept: " + johnny.dept + "\n"
      + "projects: " + johnny.projects + "\n"
      + "leave: " + johnny.leave);

var mary = new Programmer("Mary", ["Javascript","Java"]);
alert("name: " + mary.name + "\n"
      + "dept: " + mary.dept + "\n"
      + "projects: " + mary.projects + "\n"
      + "leave: " + mary.leave);

alert("changing leave of all staff to 8");
Employee.prototype.leave = 8;
alert("Johnny leave: " + johnny.leave); // 8
alert("Mary leave: " + mary.leave); // 8

alert("cannot batch move staff to another department");
Employee.prototype.dept = "sales";
alert("Johnny dept: " + johnny.dept); // programming
alert("Mary dept: " + mary.dept); // programming

Demo in jsfiddle Demo with more debug in jsfiddle