例如:
function Person() {
//person properties
this.name = "my name";
}
Person.prototype = {
//person methods
sayHello: function() {
console.log("Hello, I am a person.");
}
sayGoodbye: function() {
console.log("Goodbye");
}
}
function Student() {
//student specific properties
this.studentId = 0;
}
Student.prototype = {
//I need Student to inherit from Person
//i.e. the equivalent of
//Student.prototype = new Person();
//Student.prototype.constructor = Person;
//student specific methods
//override sayHello
sayHello: function() {
console.log("Hello, I am a student.");
}
}
我知道我可以使用这个实现:
function Student() {
this.studentId = 0;
}
Student.prototype = new Person();
Student.prototype.constructor = Person;
Student.prototype.sayHello = function () {
console.log("Hello, I am a student.");
}
但我想继续使用从第一个例子风格,并在一个单一的“.prototype”块如果可能的话中定义的所有我的类方法。
看看StackOverflow上如下回答: https://stackoverflow.com/a/17893663/783743
这个答案引入原型级同构的概念。 简单地说一个原型对象可用于一类模型。 下面的代码是从上面的回答采取:
function CLASS(prototype) {
var constructor = prototype.constructor;
constructor.prototype = prototype;
return constructor;
}
使用上面的方法,我们可以实现Person
如下:
var Person = CLASS({
constructor: function () {
this.name = "my name";
},
sayHello: function () {
console.log("Hello, I am a person.");
},
sayGoodbye: function () {
console.log("Goodbye");
}
});
然而,继承需要一些额外的工作。 因此,让我们修改CLASS
功能一点:
function CLASS(prototype, base) {
switch (typeof base) {
case "function": base = base.prototype;
case "object": prototype = Object.create(base, descriptorOf(prototype));
}
var constructor = prototype.constructor;
constructor.prototype = prototype;
return constructor;
}
我们还需要定义descriptorOf
的功能CLASS
的工作:
function descriptorOf(object) {
return Object.keys(object).reduce(function (descriptor, key) {
descriptor[key] = Object.getOwnPropertyDescriptor(object, key);
return descriptor;
}, {});
}
现在,我们可以创建Student
如下:
var Student = CLASS({
constructor: function () {
this.studentId = 0;
},
sayHello: function () {
console.log("Hello, I am a student.");
}
}, Person);
观看演示自己: http://jsfiddle.net/CaDu2/
如果您需要了解代码的任何帮助,那么请随时与我联系。
文章来源: In JavaScript, how do I inherit from a parent class in child class using a single “.prototype” block?