2

在 JS 中创建继承模式时,如下所示 -

var Fruits = function(){};
var Apples = function(){};
Apples.prototype = new Fruits;
Apples.prototype.constructor = Apples;

为什么要更改基类的构造函数?

4

2 回答 2

1

在这个例子中,苹果继承了 fruits 构造函数。这条线意味着任何创造的Apples.prototype = new Fruits未来都将从果实开始。Apple下一行将构造函数设置Apple为水果构造函数。你可以在没有原型的情况下做同样的事情,但它只会影响一个实例

于 2013-05-29T18:35:55.490 回答
0

忘记“基类”这个词。

在 JavaScript 中,用作构造函数(使用new关键字调用)的函数可以具有原型对象。原型对象的成员可以被调用或访问,就好像它们是由该构造函数创建的对象的成员一样。

简单示例:(http://jsfiddle.net/G2CUp/

var djangoFett = { // note that Django here is an object,
                   // not a constructor function and not a "class"
    shootBlaster: function() {
        alert("Blam! Blam!");
    }
};

function CloneTrooper() {
    return this;
};

CloneTrooper.prototype = djangoFett; // note that the prototype
                                     // is an object, not a "class"

var myCloneTrooper = new CloneTrooper();
myCloneTrooper.shootBlaster();

在这个例子中,我们有一个对象,它是使用构造函数djangoFett创建的对象的原型。CloneTrooper值得注意的是djangoFett- 原型CloneTrooper- 是一个对象,而不是函数或“类”。

你的代码片段是不同的 - 你的例子有两个构造函数,所以让我们添加另一个构造函数,使我的代码片段更符合你的:(http://jsfiddle.net/r28QS/

function Mandalorian() {
    this.shootBlaster = function() {
        alert("Blam! Blam!");
    }
    return this;
};

var djangoFett = new Mandalorian();

function CloneTrooper() {
    return this;
};

CloneTrooper.prototype = djangoFett; // note that the prototype
                                     // is an object, not a "class"

var myCloneTrooper = new CloneTrooper();
myCloneTrooper.shootBlaster();

这一次djangoFett不仅仅是一个对象字面量——而是通过在使用关键字时调用Mandalorian函数来创建的。new

上面的代码片段与您在问题中提供的代码片段非常相似 - 我只是在此过程中添加了一些更明确的步骤。重新构建代码以使其更符合您自己的要求:

Mandalorian = function() {};
CloneTrooper = function() {};
CloneTrooper.prototype = new Mandalorian(); // note that the prototype
                                            // is an object, not a "class"

所以如果我再改变CloneTooper.prototype.constructor价值......

// this is the same as `djangoFett.constructor = CloneTrooper`
// it does not affect the `Mandalorian` constructor function
// in any way whatsoever
CloneTooper.prototype.constructor = CloneTrooper;

...现在应该清楚的是,这不会Mandalorian以任何方式影响构造函数(“基类”)。它只影响一个对象,恰好是Mandalorian.

那么,为什么我们要更改基类的构造函数呢?答案是我们没有。我们更改原型对象的构造函数。现在,我们为什么要这样做完全是另一种蠕虫——而且已经有关于 SO 的问题来解决它

于 2013-05-29T18:54:26.303 回答