JavaScript:如果使用特定值实例化现有对象,如何创建警报?

JavaScript:如果使用特定值实例化现有对象,如何创建警报?,javascript,Javascript,(这只是出于个人好奇心) 我想在任何一个内置JavaScript对象(意思是:我自己没有定义的对象)被实例化为特定值时设置一个自动警报 例如,这里有一个名为“Test”的非内置对象: 我尝试过的一件事是向“Test”对象添加一个名为“checkName”的自执行函数,如下所示: Test.prototype.checkName = function() { var n = this.firstName; if (n == "Mickey") { alert("It's M

(这只是出于个人好奇心)

我想在任何一个内置JavaScript对象(意思是:我自己没有定义的对象)被实例化为特定值时设置一个自动警报

例如,这里有一个名为“Test”的内置对象:

我尝试过的一件事是向“Test”对象添加一个名为“checkName”的自执行函数,如下所示:

Test.prototype.checkName = function() {
   var n = this.firstName;
   if (n == "Mickey") {
      alert("It's Mickey!!");
   }
}();
但是,按以下方式实例化不会产生警报:

var a = new Test("Mickey", "Mouse");
是否可以扩充现有对象,以便在属性具有特定值时创建自动警报


如果是的话,怎么做呢?

JavaScript无法读懂你的心思。您必须手动调用该方法

它必须是一个方法,而不是一个立即调用的函数表达式。当您像这样调用它时,
将在草率模式下成为全局对象,或在严格模式下成为未定义对象。因此,
this.firstName
将成为
window.firstName
或引发异常

function Test(first, last) {
  this.firstName = first;
  this.lastName = last;
  this.checkName();
}
Test.prototype.checkName = function() {
  var n = this.firstName;
  if (n == "Mickey") {
    alert("It's Mickey!!");
  }
};
var a = new Test("Mickey", "Mouse");

JavaScript无法读懂你的心思。您必须手动调用该方法

它必须是一个方法,而不是一个立即调用的函数表达式。当您像这样调用它时,
将在草率模式下成为全局对象,或在严格模式下成为未定义对象。因此,
this.firstName
将成为
window.firstName
或引发异常

function Test(first, last) {
  this.firstName = first;
  this.lastName = last;
  this.checkName();
}
Test.prototype.checkName = function() {
  var n = this.firstName;
  if (n == "Mickey") {
    alert("It's Mickey!!");
  }
};
var a = new Test("Mickey", "Mouse");

您可以使用lib
https://github.com/Olical/EventEmitter
和extend Object.prototype以在每次创建对象时发出事件,并为您发出事件警报。

您可以使用lib
https://github.com/Olical/EventEmitter
并扩展Object.prototype以在每次创建对象时发出事件,并使事件警报。您不能修改现有构造函数,但可以替换它们。以下代码将在实例化时发出警报,被替换的构造函数将生成与前面相同的对象:

var _Set = Set;

Set = function() {
  var args = Array.prototype.slice.call(arguments, 0);
  alert(JSON.stringify(args));
  return new (Function.prototype.bind.apply(_Set, [null].concat(args)));
};

new Set("kenyér"); // alerts ["kenyér"]
但是,在此之后,您不能期望任何库正常工作,例如
instanceof
操作符不再工作:

new Set() instanceof Set  // will return false
new Set() instanceof _Set // will return true

不能修改现有构造函数,但可以替换它们。以下代码将在实例化时发出警报,被替换的构造函数将生成与前面相同的对象:

var _Set = Set;

Set = function() {
  var args = Array.prototype.slice.call(arguments, 0);
  alert(JSON.stringify(args));
  return new (Function.prototype.bind.apply(_Set, [null].concat(args)));
};

new Set("kenyér"); // alerts ["kenyér"]
但是,在此之后,您不能期望任何库正常工作,例如
instanceof
操作符不再工作:

new Set() instanceof Set  // will return false
new Set() instanceof _Set // will return true


您必须在构造函数本身中调用
this.checkName()
;没有任何东西可以为您调用它。谢谢@Pointy,但是有没有办法向我自己没有创建的对象的构造函数添加这样的调用?您不能更改已经存在的函数。您试图实现的总体目标是什么?@Pointy我认为您可以通过prototype对象扩充从现有函数创建的对象?不管怎样,我只是想弄清楚这是否可行,纯粹是为了了解更多关于JS的知识。你可以这样做,是的,但这与更改现有函数不同。向prototype对象添加方法是可以的,但是找不到新方法并自动调用它们;没有任何东西可以为您调用它。谢谢@Pointy,但是有没有办法向我自己没有创建的对象的构造函数添加这样的调用?您不能更改已经存在的函数。您试图实现的总体目标是什么?@Pointy我认为您可以通过prototype对象扩充从现有函数创建的对象?不管怎样,我只是想弄清楚这是否可行,纯粹是为了了解更多关于JS的知识。你可以这样做,是的,但这与更改现有函数不同。向原型对象添加方法是可以的,但是没有任何东西会找到新方法并自动调用它们。谢谢@Oriol,但是有没有办法向我自己没有创建的对象的构造函数(例如JS附带的函数之一)添加这样的调用?@x457812视情况而定,主体对象可以具有非标准行为。你能更具体一点吗?假设我想在JS alert()方法中添加一个函数,这样当用特定的文本字符串调用它时,它会弹出第二个警报。这可能吗?是:
var\u alert=window.alert;window.alert=function(str){if(str==“foo”){/*…*/}return\u alert.apply(this,arguments);}
谢谢@Oriol,但是有没有办法向我自己没有创建的对象(例如JS附带的函数之一)的构造函数添加这样的调用?@x457812这取决于主机对象可能具有非标准行为。你能更具体一点吗?假设我想在JS alert()方法中添加一个函数,这样当用特定的文本字符串调用它时,它会弹出第二个警报。这可能吗?是:
var\u alert=window.alert;window.alert=function(str){if(str==“foo”){/*…*/}返回_alert.apply(this,arguments);}
这很有趣。谢谢@TamasHegedus。但是你写了这样一句话“不能期望任何代码在此之后正常运行”…修改过的对象的返回值是否是唯一的结果?如果是,为什么会阻止任何代码正常运行?(我可能读得太多了,这里的“any”一词,但请解释一下)谢谢@x457812抱歉,这里不清楚。基本上,我们用工厂函数替换构造函数,因此运行环境发生了显著变化。库可能依赖于
instanceof
操作符,因此它们无法工作。这很有趣。谢谢@TamasHegedus。但是你写了这样一句话“不能期望任何代码在此之后正常运行”……修改后的对象的返回值是唯一的结果吗