我有 Java 背景,最近一直在尝试 JavaScript 继承。我开始编写一些对象,在阅读了一些示例后,我发现了最适合我的代码风格。
这是我所拥有的:
var Class = function() {};
Class.extend = function(p_constructor) {
var Superclass = this;
// the following line confuses me
p_constructor.prototype = Object.create(Superclass.prototype);
p_constructor.prototype.constructor = p_constructor;
p_constructor.extend = Superclass.extend;
return p_constructor;
};
所以现在当我想定义一个扩展类的对象时,我只需输入:
var Person = Class.extend(function(p_firstName, p_lastName) {
this.firstName = p_firstName;
this.lastName = p_lastName;
});
以下将是正确的:
var p = new Person('john', 'smith');
p instanceof Person; // true
p instanceof Class; // true
我只是很难理解Class.extend
函数中以下几行之间的有效区别是什么:
/* 1) */ p_constructor.prototype = new Superclass();
/* 2) */ p_constructor.prototype = Superclass.prototype;
/* 3) */ p_constructor.prototype = Object.create(Superclass.prototype);
/* 4) */ p_constructor.prototype = Object.create(Superclass);
我确实意识到如果某些超级构造函数抛出错误,使用第一行并不是很明智,但是第 2、3 和 4 行之间到底有什么区别?