这是一个非常古老的主题,已经写了很多,但我还没有找到关于它的确切内容,所以请多多包涵。
在花了一些时间试图了解 JavaScript 中的new
和f.prototype
构造函数结构,并阅读了它如何成为一种原型语言,更不用说 Crockford 对这个主题的启发性评论之后,我得出以下结论:在 JavaScript 中模拟传统的基于类的继承的更自然的方法,如果想要:
// emphasise that there's no superclass instead of writing A = {}
var A = Create.object(null);
// define the 'instance initializer', which half of what a constructor is
A.init = function(x, y) {
this.x = x;
this.y = y;
return this;
}
// a method
A.sum = function() {
return this.x + this.y;
}
// instantiate A
var a = Object.create(A).init(3);
// a subclass
var B = Object.create(A);
B.init = function(x, y, w) {
A.init.call(this, x, y);
this.w = w;
return this;
}
B.weightedSum = function() {
return (1.0 - this.w) * this.x + this.w * this.y;
}
// instantiate B
var b = Object.create(B).init(1, 2, 0.3);
// equivalent of `instanceof`
var bInstanceOfA = A.isPrototypeOf(b);
我喜欢这个的是它暴露了真正发生的事情,因为对象创建(适用于实例化和子类化)和初始化(仅适用于实例化)之间有明显的区别。创建基类和子类之间也存在对称性。该代码不需要外部定义的函数或库,但也不是特别冗长。
因此,我的问题如下:那些对 JavaScript 有更多经验的人能否告诉我这种方法是否存在我没有考虑的问题,或者它是否是一个好的模式?