1

我正在深入研究 Javascript,并学习构造方法的工作原理。

在下面的代码中,我希望我能够覆盖对象的构造函数,以便新创建的实例将使用新的构造函数。但是,我似乎无法让新实例使用新的构造函数。

任何有关正在发生的事情的见解将不胜感激!

function constructorQuestion() {
    alert("this is the original constructor");
};

c = new constructorQuestion();
constructorQuestion.constructor = function() { alert("new constructor");}
howComeConstructorHasNotChanged = new constructorQuestion();

这是小提琴:http: //jsfiddle.net/hammerbrostime/6nxSW/1/

4

2 回答 2

6

是函数的constructor属性,prototype而不是函数本身。做:

constructorQuestion.prototype.constructor = function() {
    alert("new constructor");
}

有关更多信息,请参阅:https ://stackoverflow.com/a/8096017/783743


顺便说一句,如果您希望代码howComeConstructorHasNotChanged = new constructorQuestion();提醒"new constructor"不会发生这种情况。这是因为您没有调用新的构造函数,而是调用了旧的构造函数。你想要的是:

howComeConstructorHasNotChanged = new constructorQuestion.prototype.constructor;

更改constructor属性不会神奇地更改构造函数。

你真正想要的是:

function constructorQuestion() {
    alert("this is the original constructor");
};

c = new constructorQuestion();

function newConstructor() {
    alert("new constructor");
}

newConstructor.prototype = constructorQuestion.prototype;

howComeConstructorHasNotChanged = new newConstructor();

这将起作用。见:http: //jsfiddle.net/GMFLv/1/

于 2013-06-19T14:27:08.623 回答
1

我认为创建具有相同原型的新对象是一样的:

function newClass(){
    alert('new class with same prototype');
}

newClass.prototype = constructorQuestion.prototype;
于 2013-06-19T14:27:26.167 回答