2014-03-05 59 views
1

这个计算函数是否会被定义一次(放置在'obj'变量的原型链中)?如果不是,那么我怎样才能在原型链上获得calc函数,这样Obj的所有实例都将引用相同的calc函数?可以使用'this'关键字计算其属性的对象

我试着将计算函数赋值给Obj.prototype.calc,但是当'obj'被创建时,它在创建过程中找不到它。

window.onload = function() { 
    var Obj = function (obj) { 
     var calc = function (o) { 
      for (p in o) { 
       if (o.hasOwnProperty(p) && typeof o[p] === 'function') { 
        o[p] = o[p](); 
       } 
      } 
      return o; 
     }; 
     return calc(obj); 
    }; 

    function test() { 
     var obj = new Obj({ 
      a: 1, 
      b: 2, 
      c: function() { 
       return this.a + this.b; 
      }, 
      d: function() { 
       return this.b * this.c; 


    } 
    }); 
    window.console.log(obj.a); // 1 
    window.console.log(obj.b); // 2 
    window.console.log(obj.c); // 3 
    window.console.log(obj.d); // 6 
} 
test(); 

}

obj的构造的目的是创造当我定义的许多版本对象文本类型语法“物镜”,但允许使用“这个”的关键字的在以下方面来计算性能每个对象的其他属性。

这里是原型定义的版本,它不工作:

<!DOCTYPE HTML> 
<html> 
<head> 
<script> 
window.onload = function() { 
    var Obj = function (obj) { 
        return calc(obj); 
       }; 
    Obj.prototype.calc = function (o) { 
          for (p in o) { 
           if (o.hasOwnProperty(p) && typeof o[p] === 'function') {       
            o[p] = o[p](); 
           } 
          } 
          return o; 
         }; 
    function test() { 
     var obj = new Obj({ 
      a:  1, 
      b:  2, 
      c:  function() {return this.a + this.b;}, 
      d:  function() {return this.b * this.c;} 
     }); 
     window.console.log(obj.a); 
     window.console.log(obj.b); 
     window.console.log(obj.c); 
     window.console.log(obj.d); 
    } 
    test(); 

} 
</script> 
</head> 
<body> 
</body> 
</html> 
+3

因为你离开了' var'在你的“calc”函数的定义中,它是**全局**。 – Pointy

+0

谢谢。我加了var以防止它走向全球。 – esnm

+0

顺便说一句,你可以(应该)缩短到'var Obj = calc = function(){...}'。 'calc'被分配给一个全局变量是一个糟糕的问题,但不是一个实际的问题,因为它不是一个闭包。 – Bergi

回答

2

将这个计算的函数定义一次(提上了原型链“OBJ”的变量)?

不,它会在每次调用Obj函数时重新创建。 (同时请注意,尖尖的,呃,指出了,你堕入The Horror of Implicit Globalscalc符号。)

如果没有,那么我怎样才能在原型链的计算功能,因此所有Obj的实例化将引用相同的计算函数?

通过把它那里,然后用它从那里:

Obj.prototype.calc = /* ...the function, use `this` rather than an argument... */; 

Obj

this.calc(); // No `return` needed 

简单的例子:

var Foo = function(x, y) { 
    this.x = x; 
    this.y = y; 
    this.calc(); 
}; 
Foo.prototype.calc = function() { 
    this.z = this.x + this.y; 
}; 

var f = new Foo(2, 3); 
console.log(f.z); // "5" 
+0

谢谢。打电话给calc时,我放弃了“this”。它现在有效。仍然得到'这个'和原型的窍门。 – esnm

相关问题