javascript - 我可以设置实例化函数的原型(prototype)吗?

标签 javascript

失败并显示“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/

相关文章:

javascript - $broadcast 不从服务中触发 (AngularJS)

javascript - 在ejs中获取 "window is not defined"

javascript - 我可以用 React Native 组件做轮播吗?

javascript - QBO3 如何获取表单上的PersonID?

javascript - AJAX 仅在首页加载时运行

javascript - 使用 javascript 的基于触摸的手机的图像裁剪工具

javascript - 如何将变量保存到文件中,以便在下次站点运行时加载这些变量?

javascript - 为什么在 for 循环中定义的变量在 setTimeout 函数中不可见?

javascript - 用户更改后文本区域未更新

javascript - 在 AngularJS 中为每个第 n 个元素自定义 ng-repeat