JavaScript继承扩展功能

Zac*_*ach 11 javascript

我在Pro JavaScript设计模式中理解这个函数末尾的IF子句时遇到了一些麻烦:

function extend(subClass, superClass) {
    var F = function() {};
    F.prototype = superClass.prototype;
    subClass.prototype = new F();
    subClass.prototype.constructor = subClass;

    subClass.superclass = superClass.prototype;
    if(superClass.prototype.constructor == Object.prototype.constructor) {
        superClass.prototype.constructor = superClass;
    }
}
Run Code Online (Sandbox Code Playgroud)

本书解释说,这些行确保正确设置超类的构造函数属性,即使超类是Object类本身也是如此.但是,如果我省略这三行并执行以下操作:

function SubClass() {};
extend(SubClass, Object);

alert(Object.prototype.constructor == Object);
Run Code Online (Sandbox Code Playgroud)

警报显示'true',这意味着即使没有最后三行,超类的构造函数也会正确设置.那么,在什么条件下,这个IF语句是否有用呢?

谢谢.

CMS*_*CMS 15

这两行试图避免的问题通常是在替换prototype构造函数的属性时产生的,例如:

function Foo () {};
Foo.prototype = {
  bar: 'baz'
};

var foo = new Foo();
foo.constructor === Object; // true, but `constructor` should refer to Foo
Run Code Online (Sandbox Code Playgroud)

当被创建功能的对象,该prototype属性初始化一个新的对象,其中包含一个constructor引用函数本身,例如属性:

function Bar () {};
var bar = new Bar();
bar.constructor === Bar; // true
Run Code Online (Sandbox Code Playgroud)

将prototype属性替换为另一个对象时,此对象具有自己的constructor属性,通常从其他构造函数继承,或者从Object.prototype.

var newObj = {};
newObj.constructor === Object;
Run Code Online (Sandbox Code Playgroud)

推荐文章: