3

我试图完全理解“扩展”在 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

4 回答 4

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”属性

混合继承

这个函数只是遍历父原型对象的所有属性,并将它们复制到子原型对象上。这就是常见的辅助函数extend所做的。它不会重置子函数的“原型”属性,但也不会设置继承链。

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

你是对的,线

child.prototype.constructor = child;

在这里非常没用 - “构造函数”属性不可枚举,不会受到extend.

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

child.parent = parent;
于 2012-08-29T19:18:28.297 回答
1

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

于 2012-08-29T17:39:10.207 回答
1

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

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

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

并实例化这样的对象(正常):

var obj = new MyClass();
于 2012-08-29T18:34:37.697 回答
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();
于 2012-08-29T17:42:17.380 回答