为什么我需要为扩展函数设置构造函数

Why do I need to set constructor for a extend function?

本文关键字:函数 设置 构造函数 扩展 为什么      更新时间:2023-09-26

我正试图完全理解"extend"在javascript中的工作原理。

这是我在谷歌上找到的一个简单的扩展函数

function extend(child, parent) {
    var f = function() {}
    f.prototype = parent.prototype;

    var i;
    for( i in parent.prototype ) {
        child.prototype[i] = parent.prototype[i];
    }

    child.prototype.constructor = child;
    child.parent = parent;
}

它有效,但我不理解"child.prototype.constructor=child"部分。没有它,该功能仍然有效。

这条线的用途是什么?

否。你在哪里找到的?它混合了两种方法:

经典原型的继承

function inherit(child, parent) {
    var f = function() {}
    f.prototype = parent.prototype;
    child.prototype = new f();
    child.prototype.constructor = child;
}

此函数创建一个新对象,该对象直接继承自parent函数的原型对象。它是Object.create()的旧式同义词。这样,就建立了一个原型链——child的所有实例也继承自parent.prototype。因为生成了一个新对象来覆盖child.prototype,所以需要更新"constructor"属性。

mixin继承

这个函数只是在父对象原型对象的所有属性上循环,并将它们复制到子对象原型对象上。这正是公共辅助函数extend所做的。它不会重置子函数的"prototype"属性,但也不会设置继承链。

function extend(child, parent) {
    for (var i in parent.prototype ) {
        child.prototype[i] = parent.prototype[i];
    }
}

你是对的,线

child.prototype.constructor = child;

在这里是非常无用的-"构造函数"属性是不可枚举的,并且不会受到extend的影响。

此外,您的函数将子函数对象的"父"属性设置为父函数,这是不需要的:

child.parent = parent;

在我看来,"child.protype.constructor"是该对象的基本/普通实现,它允许其他对象在不继承同一父对象的情况下从中扩展。因此,它是在"child.parent=parent"之前声明的。

这可能不能直接回答您的问题,但我想建议您使用John Resig:的extend实现

  • 简单JavaScript继承

它允许您创建一个名为init的构造函数,如下所示:

var MyClass = Class.extend({
    init: function() {
         console.log("Running a constructor");
    }
});

并安装这样的对象(正常):

var obj = new MyClass();

这个例子展示了如何在javascript 中继承类

var a = function(){
    // class a constructor
    this.a_priviligiate_var = 1;
}
a.prototype.a_public_var = 2;
var b = function(){
    // class b constructor
    // super call of class a constructor
    // this line makes b class to inherit all privileged vars
    b.prototype.constructor.call(this)
    this.b_priviligiate_var = 3;
}
b.prototype.b_public_var = 4;
b.prototype = new a();
var c = new b();

定义索赔:

var a = function(){
    // class a constructor
    this.a_priviligiate_var = 1;
}
a.prototype.a_public_var = 2;

定义另一个类:

var b = function(){
    // class b constructor
    // super call of class a constructor
    // this line makes b class to inherit all privileged vars
    b.prototype.constructor.call(this)
    this.b_priviligiate_var = 3;
}
b.prototype.b_public_var = 4;

正在设置超级(父)类。这条线复制了所有b.prototype

b.prototype = new a();

创建c 的实例

var c = new b();