在 JS 中创建继承模式时,如下所示 -
var Fruits = function(){};
var Apples = function(){};
Apples.prototype = new Fruits;
Apples.prototype.constructor = Apples;
为什么要更改基类的构造函数?
在 JS 中创建继承模式时,如下所示 -
var Fruits = function(){};
var Apples = function(){};
Apples.prototype = new Fruits;
Apples.prototype.constructor = Apples;
为什么要更改基类的构造函数?
在这个例子中,苹果继承了 fruits 构造函数。这条线意味着任何创造的Apples.prototype = new Fruits
未来都将从果实开始。Apple
下一行将构造函数设置Apple
为水果构造函数。你可以在没有原型的情况下做同样的事情,但它只会影响一个实例
忘记“基类”这个词。
在 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 的问题来解决它。