提供的两行代码似乎是使用原型继承的错误尝试,但我知道您将在哪里进行此操作以及您要完成的工作。
众所周知,JavaScript 中有两种方法可以定义具有属性和方法作为成员的对象——对象字面量表示法和函数表示法。使用对象字面量表示法,我们无法立即访问new
关键字(将其想象为在 Java 或 C# 中使用抽象类)。使用函数表示法,我们可以访问new
关键字,因为作为函数的对象的初始声明用作我们的构造函数。
在 ECMAScript 5 中,Object
对象被赋予了一个名为的方法,该方法create
为开发人员提供了一种简单的方法,可以从使用对象文字符号声明的现有对象创建新对象。(请参阅此处的文档)。但是,以函数表示法创建的对象在此方法中存在问题,因为它们是 Function 对象。该Object.create
方法是使用简单继承的好方法,允许访问基本属性和方法。
使用函数表示法,一旦使用new
关键字,结果就不是函数,而是对象。例如,我可以测试这个:
var Obj = function(){};
console.log(typeof Obj) // "function"
console.log(typeof new Object()); // "object"
因此,您只能继承一次(意味着子对象不能派生自):
var MyObject = new Object();
var anotherObj = new MyObject() // throws exception
为了缓解这个问题,您需要遵循三个步骤:
- 以函数表示法创建您的子对象(因此您可以使用
new
关键字创建它的新实例并从中继承)。
- 将子对象的原型(对象)设置为基础对象(也将是对象)的新实例的结果。
- 将子对象的构造函数(恰好在对象的原型上)设置回引用自身的函数(这是实例化之前的函数)。如果你不这样做,构造函数将仍然是一个对象,它不能产生新的实例。
从这里,您可以使用该模式创建子对象和父对象的新实例并从两者派生。这是一个实际的例子:
var Vehicle = function(){};
Vehicle.prototype.start = function() {
return this.make + " " + this.model + " " + "started";
}
var Car = function(color, make, model) {
this.color = color;
this.make = make;
this.model = model;
}
Car.prototype = new Vehicle();
Car.prototype.constructor = Car;
var myCar = new Car("red", "chevy", "aveo");
myCar.start(); //"chevy aveo started"