jquery Javascript -在函数中扩展此.value

zvokhttg  于 2023-03-01  发布在  jQuery
关注(0)|答案(1)|浏览(138)

首先,我知道我可以把整个文件移出供应商,并在需要的地方更新。这是我目前所做的,但我只是好奇,如果有一种方法来做到这一点,没有目前的解决方案。
我有一些供应商JS,如下所示。如果我只能访问app.test变量,有没有办法在函数中修改this.init函数?所以用我自己的函数替换this.init函数?

app.test = function(){
  this.init = function(){
   some code here that calls other this.functions that use jquery
  }
}
31moq8wy

31moq8wy1#

原始代码:

app.test = function(){
  this.init = function(){
   // some code here that calls other this.functions that use jquery
  }
}

使用了一个特定的JS特性,称为"构造函数"(与运算符new一起使用):

CustomObject = function() {
  // this = {}; // Implicitly defines `this`

  this.init = function() {
    console.log("INIT");
  }

  // return this; // Implicitly returns `this`
}

// Alternative way to do the same
function CustomObject2() {
  this.init = function() {
    console.log("INIT");
  }
}

此代码:
1.创建构造函数CustomObject,以后可以使用运算符new调用该构造函数:x = new CustomObject().
1.当用new调用时,创建一个对象并设置其属性/方法。所有内容都在构造函数中使用this.定义。
1.属性/方法将在所创建对象的上下文中工作。
因此,解决方案是用一个新的构造函数替换整个构造函数:
1.调用原始构造函数。
1.在创建的对象中用新实现替换init()
1.返回"被黑"对象。
请参阅片段:

// Prepare
app = {};
app.test = {};

// Code from the original question
app.test = function() {

  this.init = function() {
    console.log("ORIGINAL");
    this.doWork();
  }
  
  // Another method
  this.doWork = function() {
    console.log("WORK");
  }
}

// Testing out
console.log("Test #1 - Original");
var test1 = new app.test();
test1.init(); // ORIGINAL, WORK
console.log("");

// Saving old constructor function
oldAppTest = app.test;

// Creating new one
app.test = function() {
    // Calling old constructor
  result = new oldAppTest();
  // Replacing `init()` in the created object
  result.init = function() {
    console.log("NEW");
    // Call another method from the object
    result.doWork();
  }
  // Returning from constructor function
  return result;
}

// Testing out
console.log("Test #2 - Hacked init()");
var test2 = new app.test();
test2.init(); // NEW, WORK

有用链接:

相关问题