为什么我需要为extend函数设置构造函数?

时间:2012-08-29 17:19:56

标签: javascript constructor 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”部分。没有它,该功能仍然有效。

该生产线的目的是什么?

4 个答案:

答案 0 :(得分:2)

没有。你是在哪里找到那个东西的。它混合了两种方法:

经典原型继承

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"constrcutor" property needs to be updated

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;

答案 1 :(得分:1)

在我看来,'child.prototype.constructor'是对象的基本/ vanilla实现,它允许其他对象从它扩展而不继承相同的父对象。因此,为什么在'child.parent = parent'之前声明它。

答案 2 :(得分:1)

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

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

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

和instanciate对象像这样(正常):

var obj = new MyClass();

答案 3 :(得分:0)

此示例显示如何在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();

定义一个claas:

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();