失败并显示“X.m 不是函数”...
var Y = function () {
this.m = function () {
alert('this is m');
};
};
var X = new function () { };
X.prototype = new Y();
X.m();
如果我跳过 X 定义中的 new 关键字,然后在调用 m() 之前实例化 X,它肯定会起作用。为什么我不能这样做?
最佳答案
不,您不能设置原型(prototype)并使该更改影响先前存在的实例。但是,您可以修改原型(prototype)对象以获得所需的效果。但不是你尝试过的方式。这是因为您的实例 X 是一个对象,而不是一个类。 (这是因为您在定义类之前使用了“new”运算符。)
简单测试:
var X = new function () { };
alert(X.prototype); // displays "undefined" because X is an
// object not a class
因此,当您在 X 上设置“原型(prototype)”属性时,您并没有将模板对象存储在类中,您只是在对象 X 上创建一个名为“原型(prototype)”的新属性,所以,如果您这样做:
var Y = function () {
this.m = function () {
alert('this is m');
};
};
var X = new function () { };
X.prototype = new Y();
X.prototype.m(); // displays "this is m"
然后您将获得您之前预期的输出。
即使您将 X 创建为匿名类的实例,您仍然可以通过“构造函数”属性访问该类。一旦获得该引用,就可以修改原型(prototype)对象。像这样:
X.constructor.prototype.m = new Y().m;
X.m(); // displays "this is m"
但是您应该注意,这将不起作用:
X.constructor.prototype = new Y();
X.m(); // fails
因为更改整个原型(prototype)对象只会影响将来创建的实例。
关于javascript - 我可以设置实例化函数的原型(prototype)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/313049/