【问题标题】:create function in javascript with custom prototype使用自定义原型在 javascript 中创建函数
【发布时间】:2012-09-16 01:29:15
【问题描述】:

所以我创建了一个这样的函数,

var functionName = function(arg1) { //code logic here; }

同时,我需要这个函数作为一个对象工作。它不会真正保存任何东西,但会从另一个对象访问数据。

var myObj = new Object();
myObj.x = 3;
myObj.y = 4;

所以当我去的时候,functionName.x 它应该返回myObj.xmyObj 对象正在其他地方维护,我无法控制它。

这是我目前的实现方式,

functionName.__proto__ = myObj;

它工作正常。但是__proto__ 已经被弃用了,我想看看是否有其他安全的方法可以做到这一点。我想过覆盖Function.prototype,但它不起作用。

【问题讨论】:

  • 你为什么不在 functionName 中只存储对 myObj 的引用?
  • @Kryz 我不确定我是否理解。我不能做 functionName = myObj 因为这将覆盖函数定义。目前,functionName 被作为 functionName() 和 functionName.x 访问,所以我需要保持这种行为。
  • 附注:myObj应该是从Function.prototype派生出来的,这样你仍然可以访问functionName.bind等(当然这和原来的问题无关)

标签: javascript function prototype


【解决方案1】:

你想实现一个对 myObj 的委托:

     var functionName = function(arg1) { // code }

     functionName.myObj = new MyObj();
     for (prop in functionName.myObj) {
       if (functionName.myObj.hasOwnProperty(prop)) {
         functionName.__defineGetter__(prop, function() { return functionName.myObj[prop]; } );
       }
     }

【讨论】:

  • 我在这里看到的是每次 functionName() 作为函数调用时,它都会遍历 myObj 中的每个项目。这可能很慢。该对象最多可包含 500 个元素。而且,如果从未调用 functionName(),则不会定义 getter。例如,某些页面会直接使用 functionName.x 而不使用 functionName()
  • 我假设 functionName 是一个构造函数。更新答案以适用于正常功能。
  • 我认为这里遗漏了一点。 myObj 已经在某处定义并保持动态对象的集合。这意味着,它可能会在运行时丢失或获得更多元素。我不能只将内容复制到 functionName,因为一旦 myObj 得到更新,它就不会与 functionName 同步。我需要 functionName 或其原型来保存对 myObj 的引用。这在我执行 functionName.__proto__ = myObj 时有效,但我需要找到 proto 使用的替代方法,
【解决方案2】:

我在这里遇到了同样的问题。不幸的是,在 EcmaScript 5.1 下没有好的解决方案。

在语言规范http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf 中,它在 13.2“创建函数对象”中说,新创建的函数对象的 [[Prototype]] 内部属性始终是标准的内置函数原型对象。

正如同一规范13.3中详述的那样,使用Function构造函数也无济于事,因为new Function(…)构造的函数也使用13.2中详述的方法。 (这反映在Functionprototype 属性既不可写也不可配置。

所以要实现你想要的,你需要一个方法来改变已经存在的对象的原型。幸运的是,即将发布的 Ecmascript 6 标准似乎按照最新草案 http://wiki.ecmascript.org/lib/exe/fetch.php?id=harmony%3Aspecification_drafts&cache=cache&media=harmony:working_draft_ecma-262_edition_6_05-14-13-nomarkup.pdf 中的附件 B.2.2 对 Object.prototype.__proto__ 进行了标准化。

【讨论】:

    【解决方案3】:

    你可以设置函数的prototype

    function functionName(arg1) { 
        //code logic here;
    }
    
    var myObj = { x: 3, y: 4 };
    functionName.prototype = myObj;
    
    var obj = new functionName();
    console.log(obj.x, obj.y); // will output 3, 4
    

    【讨论】:

    • 我需要直接从 functionName 访问这些。 functionName() 和 functionName.x 的使用遍及不同的页面,每一个都改变不够实用。
    • 这根本不能回答 OP 的问题。 OP 想要使用自定义 __proto__ 创建一个函数。这不这样做。因此它应该被删除。
    猜你喜欢
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    相关资源
    最近更新 更多