Pro JavaScript Techniques 笔记.part.3.1.1 类式继承 by Douglas Crockford —— 问题补充

花了将近一下午和一晚上的时间,对Douglas Crockford的这个方法再测试,这个inherit方法也确实存在一些问题。而所存在的问题,也正是没有指定this.prototype.constructor = this;所造成的。测试代码如下:

var A = function (){};
A.method('get', function () {
    return 'A';
});

var B = function (){};
B.inherits(A);
B.method('get', function () {
    return 'B ' + this.uber('get');
});

var C = function (){};
C.inherits(B);
C.method('get', function () {
    return 'C ' + this.uber('get');
});

var D = function () {};
D.inherits(C);
D.method('get', function () {
    return 'D ' + this.uber('get');
});

var obj = new D ();
obj.get = function () {
    return 'the ' + this.uber('get');
};

console.log( obj.get() );

测试的结果并不是the D C B A,而是the D A; 因为inherits方法内部没有指定构造函数contructor属性,使得这几个A B C D构造函数的prototype.constructor都指向A

在D的实例obj调用get方法时,调用了uber()方法,进了else逻辑,取得了D原型上的方法。而在depth += 1之后,调用D原型上的get,其内部的uber()方法调用时,进入if逻辑,但是v = v.constructor.prototype;使得v指向了A构造函数的原型,这也就导致了直接取得了A原型上的get方法,而跳过了中间所有的类型。

或许是使用场景或者个人经验的问题。
感觉未免有种成也风云败也风云的失落。