2012-11-14 66 views
4

我想了解继承如何在JS中工作。假设我们有一个类:JavaScript的继承和实例变量

Class = function() { 
    this.A = 'A'; 
    this.B = 'B'; 
}; 

,我们正在努力扩展它

SubClass = function() {}; 
SubClass.prototype = new Class(); 

难道我understance正确,经过继承属性AB是为​​所有实例通用的,因为它们属于它的原型?如果是的话,Class如何扩展,使AB不是原型的一部分?

UPD:注意Class使用AB,所以我不能在子类中声明它们。

预先感谢您!

+2

_how可以类是扩展以便A和B不是原型的一部分?_那么使用原型的目的是什么? – elclanrs

+0

如果您希望在子类“A”和“B”的每个实例中都不要在原型中声明它,请在SubClass中声明它。 – Damask

+0

@ Prodigy,'Class'使用'A'和'B',所以我不能在SubClass中声明它们。 – Eugeny89

回答

3

所有我想要的是让A和B是每个 “实例”访问,具体

做的典型方式,这是传递参数,并将其分配给属性。然后你可以使用call来引用超类。换句话说:

function Person(name, age) { 
    this.name = name; 
    this.age = age; 
} 

function Student(name, age, grade) { 
    Person.call(this, name, age); // call super-class with sub-class properties 
    this.grade = grade; 
} 

Student.prototype = new Person(); 
Student.prototype.constructor = Student; 

var roger = new Student('Roger', 18, 'A+'); 
+0

谢谢!看起来你只是提出我需要的东西,唯一的问题是:或许应该有'Person.call(this,name,age);'而不是'Person.call(name,age);' – Eugeny89

+1

我刚才证实它确实应该是'Person.call(这个,名字,年龄)'。 '这个'参考是必不可少的。 – 2014-12-15 04:45:37

1

您可以使用父类的属性,而无需定义:

Class = function() { 
    this.sum = function() { 
     return this.a+this.b;  
    } 
}; 

SubClass = function() { 
    this.a = 5; 
    this.b = 6; 
}; 

SubClass.prototype = new Class(); 

var z = new SubClass(); 
z.sum(); //11 

另一种方法:在原型创建功能,创建您的属性:

Class = function() { 
    this.makeAB = function() { //called with context of SubClass 
     this.A = 'A'; 
     this.B = 'B';   
    } 
}; 

SubClass = function() { this.makeAB() }; 
SubClass.prototype = new Class(); 

var z = new SubClass(); 
z.A = 'AAA'; 
z.B = 'BBB'; 

var z2 = new SubClass(); 

console.log(z) 
console.log(z2)